Подтвердить что ты не робот

Передача переменной NSInteger в NSMutableDictionary или NSMutableArray

Почему это не работает:

NSInteger temp = 20;
[userSettingsFromFile setObject:temp forKey:@"aTemp"];

но это делает:

[userSettingsFromFile setObject:@"someObject" forKey:@"aTemp"];

Как я могу использовать переменную NSInteger?

4b9b3361

Ответ 1

NSInteger не является объектом - он просто выводит int на 32-разрядный или long на 64-разрядный. Так как NSDictionary может хранить только объекты, вам необходимо обернуть целое число в объект, прежде чем вы сможете его сохранить. Попробуйте следующее:

NSInteger temp = 20;
[userSettingsFromFile setObject:[NSNumber numberWithInteger:temp] 
                         forKey:@"aTemp"]; 

Ответ 2

Чтобы хранить номера в коллекциях, их нужно обернуть в экземпляр 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];

Ответ 3

Все, что вы передаете через setObject, должно быть получено из NSObject. NSInteger нет, это простой int typedef. В вашем втором примере вы используете NSString, который получен из NSObject.

Ответ 4

Коррекция: все, что передается через setObject:, не должно быть получено из класса NSObject, но оно должно соответствовать протоколу NSObject, который определяет retain и release.

Это может ввести в заблуждение, но классы и протоколы имеют разные пространства имен. И есть класс и протокол с именем NSObject, класс NSObject соответствует протоколу NSObject. Существует еще один корневой класс, класс NSProxy, который также соответствует протоколу NSObject.

Это важно, потому что в противном случае прокси не могут использоваться в коллекциях и пулах автоматического выпуска, при этом все еще имея легкий класс прокси-сервера.

Ответ 5

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];

Ответ 6

просто используйте: $(variable) синтаксис для преобразования примитивного типа в объект.

Ответ 7

Относится к ответу @Matt Ball: NSInteger не является объектом - он просто выводит int на 32-битный или длинный 64-разрядный. Поскольку NSDictionary может хранить только объекты, вам необходимо обернуть целое число в объект, прежде чем вы сможете его сохранить.

Итак, в случае Swift, как вы это делаете:

let temp:NSInteger = yourInteger.hashValue