为什么长度不适用于NSString?
我想检查字符串的长度,但是当代码执行并且命中IF
语句时,我得到unrecognized selector
。为什么长度不适用于NSString?
字典中的价值是一个字符串。
NSString * checkString = [myDictionary objectForKey:@"somekey"];
NSLog(@"length: %lu", (unsigned long)[checkString length]);
if([checkString length] > 0){
}
ERROR从控制台:
长度:0
[__NSCFNumber长度]:无法识别的选择发送到实例
为了简单:
NSString * checkString = @"my string"; //[myDictionary objectForKey:@"somekey"];
NSLog(@"length: %lu", (unsigned long)[checkString length]);
if([checkString length] > 0){
}
长度:9
[__NSCFNumber长度]:无法识别的选择发送到 实例
为什么呢?
错误提示您的实例不是NSString
而是NSNumber
。这可能是因为您在[myDictionary objectForKey:@"somekey"]
中存储了NSNumber
。
尝试将[yourValueThatYouThinkItsAString stringValue]
放入存储此值的位置。
我试过你的代码,我没有得到错误(用@“我的字符串”值)。
你可以尝试什么:
NSString *checkString = [[myDictionary objectForKey:@"somekey"] stringValue];
NSLog(@"length: %lu", (unsigned long)[checkString length]);
if([checkString length] > 0){
}
PS:在您的NSLog(),您已经有了一个额外的参数,将其删除。
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 = ...
尝试施放[myDictionary objectForKey:@“somekey”]来的NSString或使用字符串在withFormat –
根据到错误,它是一个'NSNumber'而不是'NSString'这不是因为你把它作为'NSString'转换成它是'NSString'。但奇怪的是,它正确地记录了“长度:%lu”,所以问题就在它之后,导致崩溃的代码是什么?如果你做'[[myDictionary objectForKey:@“somekey”] isKindOfClass:[NSString class]]返回TRUE? – Larme
如果那是你真实的代码,那么这个输出就没有意义了。这实际上是你正在运行的真正的代码复制粘贴到你的问题?你确定NSLog和if语句都指向同一个变量? – dan