To jest pytanie o styl programowania w Swift, w szczególności Int
vs UInt
.Dlaczego przewodnik językowy Swift sugeruje używanie Int "nawet jeśli znane są wartości nieujemne"?
Przewodnik po języku programowania Swift zaleca programistom używanie ogólnego typu liczbowego ze znakiem Int
, nawet jeśli zmienne są znane jako nieujemne. Od the guide:
Zastosowanie Uint tylko wtedy, gdy wyraźnie potrzebują unsigned całkowitą o takiej samej wielkości jak natywny słowo platformy. Jeśli tak nie jest, preferowane jest Int, nawet jeśli znane wartości nie są negatywne. Spójne użycie wartości Int dla wartości całkowitych pomaga w interoperacyjności kodu, pozwala uniknąć konwersji między różnymi typami liczb i dopasowuje wnioskowanie typu całkowitego, zgodnie z opisem w Bezpieczeństwie Typu i Wniosku Typu.
Jednak UInt
będzie 32-bitowa bez znaku na 32-bitowych i 64-bitowych bez znaku w 64-bitowych architektur więc nie ma korzyści wydajność do korzystania Int
nad UInt
.
Natomiast Swift przewodnik daje późniejszą przykład:
let wiek = -3
assert (wiek> = 0, "wiek danej osoby nie może być mniejsza niż zero")
// powoduje to twierdzenie na spust, bo wiek nie jest> = 0
Tutaj, Runtime problem mógł być złapany na skompilować czas jeśli kod został napisany jako:
let age:UInt = -3
// this causes a compiler error because -3 is negative
Istnieje wiele innych przypadkach (np niczego, co będzie indeksować zbiór), w którym za pomocą UInt
by złapać problemy w czasie kompilacji zamiast wykonywania.
Pytanie więc: czy porady w języku programowania Swift Programming brzmią i czy korzyści z używania Int
"nawet jeśli znane wartości nie są negatywne" przewyższają korzyści związane z bezpieczeństwem korzystania z UInt
?
Dodatkowa uwaga: Po Swift używany przez kilka tygodni jego jasne, że współdziałanie z kakao wymagana jestUInt
. Na przykład struktura AVFoundation
używa liczb całkowitych bez znaku, gdzie wymagane jest "zliczanie" (liczba próbek/ramek/kanałów itd.). Konwersja te wartości do Int
może prowadzić do poważnych błędów w których wartości są większe niż Int.max
Z pewnością zależy to od tego, co uważasz za ważne. Byłbym skłonny zgodzić się z dokumentacją, że po prostu sprawia, że kod jest prostszy w pracy z 'int' –
@JackJames Zgadzam się, że jest to kwestia priorytetów poszczególnych programistów i kodu, nad którym pracuję. Nie widzę przekonującego przypadku w taki czy inny sposób, co sprawia, że myślę, że Apple nie powinien doradzać ludziom, aby nie używali UInt, gdy sztywno trzymający się Inta mógłby spowodować, że kod złamie się na wiele nieprzyjemnych sposobów. –
Tradycyjny powód zniechęcania liczb całkowitych bez znaku w C jest taki, że pętla 'for' zliczająca w dół może łatwo pójść źle; na przykład 'for (unsigned a = 10; a> 0; - a)' jest błędne, ponieważ 'a' jest * zawsze *> 0 z definicji. – alastair