2016-06-28 83 views
-3

我想检查字符串的长度,但是当代码执行并且命中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长度]:无法识别的选择发送到 实例

为什么呢?

+0

尝试施放[myDictionary objectForKey:@“somekey”]来的NSString或使用字符串在withFormat –

+0

根据到错误,它是一个'NSNumber'而不是'NSString'这不是因为你把它作为'NSString'转换成它是'NSString'。但奇怪的是,它正确地记录了“长度:%lu”,所以问题就在它之后,导致崩溃的代码是什么?如果你做'[[myDictionary objectForKey:@“somekey”] isKindOfClass:[NSString class]]返回TRUE? – Larme

+3

如果那是你真实的代码,那么这个输出就没有意义了。这实际上是你正在运行的真正的代码复制粘贴到你的问题?你确定NSLog和if语句都指向同一个变量? – dan

回答

3

错误提示您的实例不是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(),您已经有了一个额外的参数,将其删除。

+0

不是它的一个NSNumber,它是字典中的一个字符串。 –

+1

不,它不是:)检查我的编辑。 – AnthoPak

+0

检查修改后的问题。 –

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 = ... 
+0

那么为什么它NSLog 0,但在IF失败?字典中的值是一个字符串。 –

+0

请检查修改后的问题。 –

+0

@Firemarble请检查修改后的答案。 – dasblinkenlight