Objective-C словарь, вставляющий BOOL
Хорошо, я немного смущен.
Это, вероятно, просто тривиальность.
У меня есть функция, которая выглядит примерно так:
- (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 в словарь?
Ответы
Ответ 1
Значения в NSDictionary
должны быть объектами. Чтобы решить эту проблему, оберните булевы в объектах NSNumber
:
[parameters setValue:[NSNumber numberWithBool:news] forKey:@"news"];
[parameters setValue:[NSNumber numberWithBool:mails] forKey:@"mails"];
Ответ 2
Контейнеры Objective-C могут хранить только объекты Objective-C, поэтому вам нужно обернуть BOOL в некоторый объект. Вы можете создать объект NSNumber с помощью [NSNumber numberWithBool]
и сохранить результат.
Позже вы можете вернуть свое логическое значение с помощью NSNumber -boolValue
.
Ответ 3
BOOL не является объектом - это синоним для int и имеет 0 или 1 в качестве его значений. В результате он не будет помещен в объектно-содержащую структуру.
Вы можете использовать NSNumber для создания обертки объектов для любого из целочисленных типов; существует конструктор [NSNumber numberWithBool:]
, который вы можете вызвать для получения объекта, а затем использовать его. Аналогично, вы можете использовать это, чтобы вернуть объект обратно: [obj boolValue]
.
Ответ 4
Современный код для справки:
parameters[@"getNews"] = @(news);
Ответ 5
Вы можете вставить @"YES"
или @"NO"
строковые объекты, а Cocoa будет отбрасывать его на bool после их чтения.
В противном случае я бы предложил создать словарь, используя метод factory, например dictionaryWithObjectsAndKeys:
.
Ответ 6
Увидев ответ @Steve Harrison, у меня есть один комментарий. По какой-то причине это не работает с передачей свойств объекта, например, например,
[parameters setValue:[NSNumber numberWithBool:myObject.hasNews] forKey:@"news"];
Это устанавливает ключ news
в значение null в параметре NSDictionary
(по какой-то причине непонятно почему)
Моим единственным решением было использовать метод @Eimantas следующим образом:
[parameters setValue:[NSNumber numberWithBool:myObject.hasNews ? @"YES" : @"NO"] forKey:@"news"];
Это работало безупречно. Не спрашивайте меня, почему передача BOOL
напрямую не работает, но по крайней мере я нашел решение. Любые идеи?