Как получить BOOL от id - PullRequest
       22

Как получить BOOL от id

16 голосов
/ 05 августа 2009

Я вызываю valueForKey для объекта. Это возвращает идентификатор, который я пытался привести к BOOL (потому что я знаю, что значение - BOOL). Но XCode выдает следующее предупреждение:

"предупреждение: приведение от указателя к целому числу другого размера ..."

Итак, что я в итоге сделал, это:

BOOL value = [[NSNumber numberWithInt:((NSInteger)[managedObject valueForKey:@"fieldName"])] boolValue];

Я думаю, что должен быть более легкий путь. Есть ли?

Ответы [ 5 ]

31 голосов
/ 05 августа 2009

-valueForKey: всегда возвращает объект. id - это тип target-c для указателя на любой объект.

Вы можете проверить объект в отладчике. Некоторые полезные команды:

po value
po [value class]

Вы обнаружите, что значение на самом деле является NSNumber, поэтому вы можете отправить ему сообщение -boolValue, чтобы получить интересующий вас флаг BOOL.

27 голосов
/ 11 декабря 2010
//value = (id)
NSNumber *val = value;
BOOL success = [val boolValue];
if (success) {
 //yay!
}
9 голосов
/ 05 августа 2009

Если значением ключа является BOOL, возвращаемый объект будет NSNumber. Вы можете просто попросить его за boolValue. Вы не можете просто привести объект (id) к BOOL или целому числу или любому другому не-объектному типу. Механизм KVC автоматически упаковывает скаляры в соответствующий тип значения, так что вы можете просто спросить его, какой тип вам нужен. Вас могут заинтересовать документы KVC - они объясняют это более подробно.

1 голос
/ 05 января 2016

Легче? Возможно нет. Более кратко? Не тогда, когда вы спросили, а в современном (по крайней мере, с 2015 года) Obj-C, да. Если ваш объект представляет собой словарь со строковыми или числовыми значениями (NSDictionary<id, StringOrNumber>) любого рода, вы можете использовать:

BOOL value = @(managedObject[@"fieldName"]).boolValue;

Обратите внимание, что также, если вы знаете, что значение, полученное из @"fieldName", равно NSNumber, вы можете просто пропустить преобразование:

BOOL value = [managedObject[@"fieldName"] boolValue];

Почему?

Благодаря некоторым изменениям в компиляторе LLVM:

  • NSDictionary теперь можно читать и записывать с использованием знакомого синтаксиса dictionary[key]
  • Совместимые значения можно преобразовать в NSNumber с использованием синтаксиса @(value). 1024 * более *
  • Все свойства (и методы, которые принимают нулевые аргументы и возвращают значение) могут быть доступны с использованием точечного синтаксиса: object.property и object.method.

Сейчас много хорошего синтаксического сахара. Я рекомендую вам взглянуть на это!

0 голосов
/ 22 мая 2017

Swift 3

if let boolValue = dict["key"] as? Bool {
    // do something with boolValue
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...