2011-07-15 8 views
34

Po numerem In Cocoa do you prefer NSInteger or just regular int, and why? pojawiła się wzmianka o NSDouble i NSFloat, ale nie widzę odniesienia do tych w żadnej dokumentacji. Jeśli celem jest ochrona architektury, to co z innymi typami, takimi jak double lub float?Czy istnieją NSDouble, NSFloat lub inne typy niż NSInteger?

+1

Nie jestem również pewien, o czym mówi OP. Te nie istnieją. – BoltClock

+0

Więc podwójne i pływające są bezpieczne architektonicznie? Mogę użyć podwójnego, ale kiedy dochodzi do int, muszę użyć NSIntegera, właśnie tak? – sarunw

+3

Nie sądzę, że * NSFloat *, * NSDouble * istnieje. Ale wiem, że CGFloat istnieje (poza kontekstem pytania. Huh?) – EmptyStack

Odpowiedz

79

NSInteger istnieje, ponieważ typ int różni się rozmiarem między systemami 32-bitowymi i 64-bitowymi. float i double nie różnią się rozmiarem w ten sam sposób, więc nie ma potrzeby tworzenia ich typów.

+0

Co więc zrobić, jeśli chcę dodać podwójne do NSArray? Akceptuje tylko obiekty. –

+6

Zawiń w obiekt NSNumber (który jest podklasą bardziej ogólnej wartości NSV). – duskwuff

+11

Cóż, istnieje 'CGFloat', który jest' typedef' dla 'float' na 32bit i' double' na 64bit. Co jest całkiem równoznaczne z tym, co zostało zrobione z 'NS (U) Integer', powiedziałbym. – Regexident

5

Nie ma NSFloat ale wiem API rdzeń graficzny ostatecznie zmieniły się od float do CGFloat tak, że może użyć double na niektórych architekturach.

Najlepiej używać dokładnie tych typów, które deklarują nagłówki API. To powoduje automatyczną zmianę typu, jeśli kiedykolwiek przekompilujesz kod dla innego celu.

0

Chodzi także o konwencje.

Typedef do int jest niezgodne z int int się.

Przykład: pid_t ma typ int, ale podanie int spowoduje utworzenie ostrzeżenia.

Dlaczego? Ponieważ chcesz mieć pewność, że przekraczając granice API, każdy wie, czego oczekuje kod.

Istnieją typy pływające i podwójne, tzn. NSTimeInterval. Nie chodzi tu o podstawowy typ, ale o konwencję, do której należy się stosować.

Jeśli zadeklarujesz lokalny int jako licznik pętli i nie planujesz przekazać go do dobrze zdefiniowanego API, to dobrze jest wywołać int int.

Powiązane problemy