Словарь Objective-C, вставляющий BOOL - PullRequest
61 голосов
/ 21 января 2010

ОК, я немного запутался. Это, наверное, просто мелочь.

У меня есть функция, которая выглядит примерно так:

- (void)getNumbersForNews:(BOOL)news andMails:(BOOL)mails {
NSMutableDictionary *parameters = [[NSMutableDictionary alloc] init];
[parameters setValue:news  forKey:@"getNews"];
[parameters setValue:mails forKey:@"getMails"];...}

Не имеет значения, использую ли я setValue:forKey: или setObject:ForKey:, я всегда получаю предупреждение:

"Передача аргумента 1 из набора ... делает указатель из целого числа без приведения" ...

Как же я могу вставить bool в словарь?

Ответы [ 6 ]

122 голосов
/ 21 января 2010

Значения в NSDictionary должны быть объектами.Чтобы решить эту проблему, оберните логические значения в NSNumber объекты:

[parameters setValue:[NSNumber numberWithBool:news] forKey:@"news"];
[parameters setValue:[NSNumber numberWithBool:mails] forKey:@"mails"];
14 голосов
/ 21 января 2010

Контейнеры Objective-C могут хранить только объекты Objective-C, поэтому вам нужно обернуть BOOL в некоторый объект. Вы можете создать объект NSNumber с помощью [NSNumber numberWithBool] и сохранить результат.
Позже вы можете вернуть свое логическое значение, используя NSNumber's -boolValue.

8 голосов
/ 09 марта 2015

Современный код для справки:

parameters[@"getNews"] = @(news);
8 голосов
/ 21 января 2010

BOOL не является объектом - это синоним для int и имеет 0 или 1 в качестве значений. В результате он не будет помещен в объектосодержащую структуру.

Вы можете использовать NSNumber для создания обертки объекта для любого из целочисленных типов; есть конструктор [NSNumber numberWithBool:], который вы можете вызвать, чтобы получить объект, а затем использовать его. Точно так же вы можете использовать это, чтобы вернуть объект снова: [obj boolValue].

6 голосов
/ 21 января 2010

Вы можете вставить @"YES" или @"NO" строковые объекты, и Какао приведёт их к bool, как только вы прочитаете их обратно.

В противном случае я бы предложил создать словарь с использованием заводского метода, например dictionaryWithObjectsAndKeys:.

2 голосов
/ 28 марта 2013

Видя ответ Стива Харрисона, у меня есть один комментарий. По некоторым причинам это не работает с передачей свойств объекта, например, для

 [parameters setValue:[NSNumber numberWithBool:myObject.hasNews] forKey:@"news"];

Устанавливает для ключа news значение null в параметре NSDictionary (по какой-то причине не может понять, почему)

Мое единственное решение состояло в том, чтобы использовать способ @ Eimantas следующим образом:

[parameters setValue:[NSNumber numberWithBool:myObject.hasNews ? @"YES" : @"NO"] forKey:@"news"];

Это сработало безупречно. Не спрашивайте меня, почему передача BOOL напрямую не работает, но, по крайней мере, я нашел решение. Есть идеи?

...