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

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

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

Так что я закончил делать это:

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

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

Ответы

Ответ 1

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

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

po value
po [value class]

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

Ответ 2

//value = (id)
NSNumber *val = value;
BOOL success = [val boolValue];
if (success) {
 //yay!
}

Ответ 3

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

Ответ 4

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

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

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

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

Почему?

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

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

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

Ответ 5

Swift 3

if let boolValue = dict["key"] as? Bool {
    // do something with boolValue
}