Поскольку объект для ключа также может быть другим классом, boolValue может вызывать ошибку (может генерировать исключение, если не класс NSNumber) и все, что лежит, если это число 0 или 1, это мое решение:
- (BOOL)isBooleanKey:(id)key
{
#ifndef kNullString // can be somewhere
#define kNullString @"(null)"
#endif
if (!key){
NSLog(@"WARNING:[- (BOOL)%@(id)key, \"key\" is nil]\n", NSStringFromSelector(_cmd));
return NO;
}
if ([key isKindOfClass:[NSNumber class]]) {
NSDictionary *dict = [NSDictionary dictionaryWithObject:key forKey:@"test"];
if (!dict) return NO;
NSError *err = nil;
NSPropertyListFormat fmt = NSPropertyListXMLFormat_v1_0;
id data = [NSPropertyListSerialization dataWithPropertyList:dict format:NSPropertyListXMLFormat_v1_0 options:0 error:&err];
if(!data) {
NSLog(@"dict is not a XMLFormat v1\n"); // anyway this can't be happen here, unless something is really bad!
}
id pl =[NSPropertyListSerialization propertyListWithData:data options:NSPropertyListMutableContainersAndLeaves format:&fmt error:&err];
#if 0
NSLog(@" err: %@", err.localizedDescription);
#endif
if(!pl) {
[NSException raise: NSParseErrorException format:@"%@\n", err];
if(![data isKindOfClass:[NSDictionary class]])
[NSException raise: NSParseErrorException
format: @"dict does not contain a property list\n"];
}
NSString* plist = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
if (plist.length < 1 || [plist isEqualToString:kNullString]) return NO; //kNullString is a macro -> @"(null)"
// dict has only one key, so if it's not soup is soaked bread!
if ([plist rangeOfString:@"<true/>"].location != NSNotFound
|| [plist rangeOfString:@"<false/>"].location != NSNotFound) {
// object for key is a boolean for sure (not simply a number!)
return YES;
}
}
// key is not a boolean
return NO;
}
Без исключений, и скажу вам правду!
if ([self isBooleanKey:[someobject forKey:@"some key"]]]) {
// Yes
} else {
// NO
}