我正在尝试检查字符串的长度,但是在代码执行时我得到unrecognized selector
并点击IF
语句。
字典中的值是一个字符串。
NSString * checkString = [myDictionary objectForKey:@"somekey"];
NSLog(@"length: %lu", (unsigned long)[checkString length]);
if([checkString length] > 0){
}
错误来自控制台:
长度:0
[__NSCFNumber length]:无法识别的选择器发送到实例
为简单起见:
NSString * checkString = @"my string"; //[myDictionary objectForKey:@"somekey"];
NSLog(@"length: %lu", (unsigned long)[checkString length]);
if([checkString length] > 0){
}
长度:9
[__NSCFNumber length]:发送到的无法识别的选择器 实例
为什么?
答案 0 :(得分:3)
错误表明您的实例不是NSString
而是NSNumber
。这可能是因为您在NSNumber
中存储了[myDictionary objectForKey:@"somekey"]
。
尝试将[yourValueThatYouThinkItsAString stringValue]
放在存储此值的位置。
我尝试了你的代码并且我没有收到错误(使用@“my string”值)。
你可以尝试:
NSString *checkString = [[myDictionary objectForKey:@"somekey"] stringValue];
NSLog(@"length: %lu", (unsigned long)[checkString length]);
if([checkString length] > 0){
}
PS:在你的NSLog()中,你还有一个额外的参数,将其删除。
答案 1 :(得分:1)
length
无效NSString*
的原因是它不是NSString*
。尽管使用了Objective-C无法验证的强制转换,但字典中的对象是NSNumber*
,而不是NSString*
。这就是代码编译的原因,但无法运行。
[myDictionary objectForKey:@"somekey"]
调用返回id
,一个通用对象引用。这就是为什么当你对NSString*
进行强制转换时,Objective-C必须信任你"somekey"
处的对象实际上是一个字符串。
它在NSLog
中没有失败,因为你犯了一个错误,导致无法评估长度。更改NSLog
以查看其失败:
NSLog(@"length: %lu", (unsigned long)[checkString length]);
如果你有XCode 7或更新版本,你可以使用轻量级泛型来帮助Objective-C进行类型检查。您可以为字典中的键和值指定对象类型,以便编译器可以为您捕获无效的强制转换:
NSDictionary<NSString*,NSString*> *myDictionary = ...