В чем разница между NSNumber и NSInteger?
в чем разница между NSNumber и NSInteger? Есть ли еще такие примитивы, о которых я должен знать? Есть ли один для поплавков?
5 ответов
существующие ответы полезны; добавление к ним:
да NSUInteger
дает дважды диапазон среди положительных целых чисел как NSInteger
, но я думаю, что еще одна критическая причина выбирать между ними-просто различать случаи где отрицательные значения просто не имеет смысла.
пример: возвращаемое значение NSArray
' s count
метод NSUInteger
, который имеет смысл, так как мы не можем иметь массив с отрицательным числом стихий. Когда кодер знает, что он неподписан, он/она имеет больше свободы для выполнения операций, которые могут быть ненадежными в подписанном случае, включая побитовые операции, такие как сдвиг. этот блог подробнее о подписанном vs без подписи.
мое предположение о CGFloat
vs NSFloat
(которого не существует): возможно, конструкторам элементов кода с именем NeXTStep просто не нужно было указывать слишком много значений float, за пределами временные отрезки. Так они дали NSTimeInterval
, который является типом с плавающей запятой, но который явно предназначен для использования с временными интервалами. И, честно говоря, это здорово иметь такой тип, потому что вы знаете, что он всегда должен быть в секундах без необходимости иметь дело со структурой. Когда вы переходите в графический мир (где живет Core Graphics), внезапно вокруг вас появляются поплавки, парящие в воздухе (ха-ха). Поэтому имеет смысл ввести CGFloat
там. Этот абзац весь " образованный предположение."
кроме того, просто чтобы быть ясным о почему вы могли бы использовать NSInteger
etc вместо примитивных типов: потому что таким образом легче писать портативный код, который в полной мере использует архитектуру машины. Например,CGFloat
использует 32 бита на некоторых машинах и 64 бита на других, в зависимости в основном от того, сколько разрыва в эффективности на этих машинах для этих размеров. В некоторых случаях нет реального ускорения для использования 32 бит против 64 бит, поэтому вы можно также использовать 64 бита. Если вы объявили вещи как CGFloat
, вы внезапно получаете эту дополнительную точность "бесплатно" при перекомпиляции.
и, как указал икендак,NSNumber
является классом-оболочкой для всех из этих (и других примитивных или квази-примитивных типов, таких как BOOL
), который позволяет включить его в свой NSArray
s и NSDictionary
s, архивировать их легче, и делать другие вещи, которые NSObject
S может сделать.
NSNumber
- это класс, а не примитив, и используется, когда вам нужно поместить необработанные числа в словари, массивы или иным образом инкапсулировать их. NSInteger
, NSUInteger
, CGFloat
и т. д. являются простыми типами и соответствуют (на 32-bt системах, таких как iPhone)int
, unsigned int
и float
.
как правило, если вам нужно хранить номер где-то, используйте NSNumber
. Если вы делаете вычисления, циклы и т. д., Используйте NSInteger
, NSUInteger
или CGFloat
.
вы можете обернуть NSInteger
на NSNumber
:
NSNumber *aNumber = [NSNumber numberWithInteger:21];
... и получить его обратно:
NSInteger anInteger = [aNumber integerValue];
вы можете узнать больше информации здесь:http://iosdevelopertips.com/cocoa/nsnumber-and-nsinteger.html
NSInteger так же, как традиционный int
В С. Это определение типа. Есть и другие, подобные NSUInteger
, CGFloat
, etc. что все они являются синонимами примитивных типов.
NSNumber полезен, когда вам нужно вставить число в NSArray или NSDictionary. Стандартная практика заключается в использовании этих коллекций против сворачивания собственных; недостатком является то, что они могут содержать только объекты Objective-C.
NSNumber, по сути, заключающей int
(или float и т. д.) В Obj-C объект (похожий на концепцию "бокса" примитивного типа C#/Java), который можно добавить в массив:
NSArray * myArray = [[NSArray alloc] init];
[myArray addObject:3]; // invalid, will not compile.
[myArray [NSNumber numberWithInt:3]]; // ok
по соображениям производительности, если можно, используйте примитивные типы (например, int, float, int[]). Однако иногда вы не можете избежать NSArray / NSNumber, например, когда вы читаете или записываете записи в .
NSNumber обычно используется для хранения переменных, NSUInteger используется для арифметики
вы можете изменить NSNumber на NSUInteger, выполнив следующее:
NSNumber *variable = @1;
NSUInteger variableInt = [variable unsignedIntegerValue];
Это было сказано ранее, но как общее эмпирическое правило, переменные, которые должны быть определены с помощью*, являются объективными классами C, тогда как переменные, которые не нуждаются в A*, являются примитивами C.
как уже говорили другие,NSNumber
это NSObject
подкласс. Это не примитив C (как int, unsigned int, float, double и т. д.) NSInteger
, CGFloat
, NSUInteger
простые typedefs
на C первообразных.
необходимость NSNumber
возникает из-за необходимости использовать числа в качестве параметров в API, которые требуют объекты. Например, когда вы хотите сохранить номер в NSArray
, в Core-Data, или в NSDictionary
.
есть ли больше примитивов, таких как это то, о чем я должен знать? Ну,NSNumber
не является примитивным типом, и он охватывает все виды чисел (поплавки, интегральные типы, булевы и так далее). Вы также должны узнать о NSValue, который является базой для NSNumber
.
есть ли один для поплавков? Нет" NS " typedef для float, но NSNumber
смогите обернуть вокруг любого номера поплавка:
NSNumber *myPi = [NSNumber numberWithFloat:3.1415926];
или вы можете использовать примитивный тип CGFloat CoreGraphics.