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

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 в словарь?

4b9b3361

Ответ 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 напрямую не работает, но по крайней мере я нашел решение. Любые идеи?