NSDictionary获取值,因为字符串不会抱怨但lenngth或isEqualToString崩溃

问题描述 投票:0回答:1

我得到了一个像下面的Json作为回复消息。

data:{
    type = DATA;
    version = "4.51";
}

我在下面的方法中进行处理,从调试器看起来那个版本号是字符串。

-(void)processResponse:(NSDictionary *)responseDictionary{
    NSString *version = [responseDictionary valueForKey:@"version"];
    if([version isEqualToString:@"4.51"]){ //line 3
        NSLog(@"do something"); //crashes
    }
}

但第3行崩溃了。我的问题是为什么这条线崩溃了?处理这种类型的字典消息的最佳方法是什么?

objective-c json nsdictionary
1个回答
1
投票

如果这是源自程序之外的数据,则必须始终检查类型。

-(void)processResponse:(NSDictionary *)responseDictionary {
    id value = responseDictionary[@"version"];
    if ([value isKindOfClass: [NSString class]]) {
        NSString *version = value;
        if ([version isEqualToString: @"4.51"]) {
            NSLog(@"do something"); //crashes
        }
    }
}

如果这就是你要做的全部,那么你可以用&&短路来缩短它,如果你小心的话。

-(void)processResponse:(NSDictionary *)responseDictionary {
    NSString *version = responseDictionary[@"version"];
    if ([version isKindOfClass: [NSString class]] 
        && [version isEqualToString: @"4.51"]) {

        NSLog(@"do something"); //crashes
    }
}

只是要非常小心,因为这意味着version存在于这个if块之外,可能不是正确的类型。

同样,如果这正是你的问题,你也可以通过使用适用于所有isEqual:NSObject来简化它:

-(void)processResponse:(NSDictionary *)responseDictionary {
    id version = responseDictionary[@"version"];
    if ([version isEqual: @"4.51"]) {
        NSLog(@"do something"); //crashes
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.