Передача переменной NSInteger в NSMutableDictionary или NSMutableArray - PullRequest
40 голосов
/ 27 августа 2009

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

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

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

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

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

Ответы [ 7 ]

92 голосов
/ 27 августа 2009

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

NSInteger temp = 20;
[userSettingsFromFile setObject:[NSNumber numberWithInteger:temp] 
                         forKey:@"aTemp"]; 
6 голосов
/ 27 августа 2009

Чтобы сохранить числа в коллекциях, вы должны обернуть их в 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];
2 голосов
/ 27 августа 2009

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

1 голос
/ 05 августа 2013

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 из подписанного или беззнакового символа, 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];
0 голосов
/ 11 января 2017

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

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

let temp:NSInteger = yourInteger.hashValue
0 голосов
/ 11 июня 2015

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

0 голосов
/ 29 августа 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...