Как получить 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
}