为什么长度不适用于NSString?

时间:2016-06-28 15:43:37

标签: ios objective-c if-statement nsstring

我正在尝试检查字符串的长度,但是在代码执行时我得到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]:发送到的无法识别的选择器   实例

为什么?

2 个答案:

答案 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 = ...