Почему это не работает:
NSInteger temp = 20;
[userSettingsFromFile setObject:temp forKey:@"aTemp"];
но это делает:
[userSettingsFromFile setObject:@"someObject" forKey:@"aTemp"];
Как я могу использовать переменную NSInteger
?
Почему это не работает:
NSInteger temp = 20;
[userSettingsFromFile setObject:temp forKey:@"aTemp"];
но это делает:
[userSettingsFromFile setObject:@"someObject" forKey:@"aTemp"];
Как я могу использовать переменную NSInteger
?
NSInteger
не является объектом - он просто выводит int
на 32-разрядный или long
на 64-разрядный. Так как NSDictionary
может хранить только объекты, вам необходимо обернуть целое число в объект, прежде чем вы сможете его сохранить. Попробуйте следующее:
NSInteger temp = 20;
[userSettingsFromFile setObject:[NSNumber numberWithInteger:temp]
forKey:@"aTemp"];
Чтобы хранить номера в коллекциях, их нужно обернуть в экземпляр NSNumber
.
double aDouble = 20.3d;
NSInteger anInt = 20;
NSNumber *aWrappedDouble = [NSNumber numberWithDouble:aDouble];
NSNumber *aWrappedInt = [NSNumber numberWithInteger:anInt];
NSArray *anArray = [NSArray arrayWithObjects:aWrappedDouble, aWrappedInt, nil];
Все, что вы передаете через setObject, должно быть получено из NSObject
. NSInteger
нет, это простой int typedef. В вашем втором примере вы используете NSString
, который получен из NSObject
.
Коррекция: все, что передается через setObject:
, не должно быть получено из класса NSObject
, но оно должно соответствовать протоколу NSObject
, который определяет retain
и release
.
Это может ввести в заблуждение, но классы и протоколы имеют разные пространства имен. И есть класс и протокол с именем NSObject
, класс NSObject
соответствует протоколу NSObject
. Существует еще один корневой класс, класс NSProxy
, который также соответствует протоколу NSObject
.
Это важно, потому что в противном случае прокси не могут использоваться в коллекциях и пулах автоматического выпуска, при этом все еще имея легкий класс прокси-сервера.
NSInteger - синоним длинного целого числа. Далее следует, как определяется NSInteger:
#if __LP64__ || NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef int NSInteger;
typedef unsigned int NSUInteger;
#endif
NSNumber - это класс Objective-C, конкретный подкласс NSValue. Вы можете создать объект NSNumber из подписанного или unsigned char, short int, int, long int, long long int, float, double или BOOL
Одно из основных отличий заключается в том, что вы можете использовать NSNumber в коллекциях, таких как NSArray, где требуется объект. Например, если вам нужно добавить float в NSArray, вам сначала нужно создать объект NSNumber из float:
float percentage = 40.5;
... // Создаем объект NSNumber, который теперь можно вставить в NSArray
NSNumber *percentageObject = [NSNumber numberWithFloat:percentage];
просто используйте: $(variable)
синтаксис для преобразования примитивного типа в объект.
Относится к ответу @Matt Ball: NSInteger не является объектом - он просто выводит int на 32-битный или длинный 64-разрядный. Поскольку NSDictionary может хранить только объекты, вам необходимо обернуть целое число в объект, прежде чем вы сможете его сохранить.
Итак, в случае Swift, как вы это делаете:
let temp:NSInteger = yourInteger.hashValue