我正在尝试将text
字符串设置为URL。以下代码有效,但我觉得我可以重构它以使它看起来更整洁。
NSString *text = @“”;
id json = [NSJSONSerialization JSONObjectWithData:[data dataUsingEncoding:NSUTF8StringEncoding] options:0 error:nil];
if ([json isKindOfClass:[NSDictionary class]]) {
id data = json[@“data”];
if ([data isKindOfClass:[NSDictionary class]]) {
id value = data[@"value"];
if ([value isKindOfClass:[NSArray class]]) {
id url = [value valueForKey:@"url"];
if ([url isKindOfClass:[NSString class]]) {
text = url;
}
}
}
}
到目前为止,整个“毁灭之山”正在进行中,我想知道如何在不使用如此多的if语句的情况下检查对象类型是否正确。任何提示或建议都表示赞赏。
编辑:这是我的代码的精简版,但概念是相同的。
答案 0 :(得分:3)
在我看来,有两种方法可以让它看起来更整洁,并忽略if-else-nesting-hell。
使用return
。
NSString *text = @“”;
id json = [NSJSONSerialization JSONObjectWithData:[data dataUsingEncoding:NSUTF8StringEncoding] options:0 error:nil];
if (![json isKindOfClass:[NSDictionary class]]) {
return;
}
id data = json[@“data”];
if (![data isKindOfClass:[NSDictionary class]]) {
return;
}
id value = data[@"value"];
if (![value isKindOfClass:[NSArray class]]) {
return;
}
id url = [value valueForKey:@"url"];
if (![url isKindOfClass:[NSString class]]) {
return;
}
text = url;
创建一个通用方法,用于检查类的类型并返回安全值
- (id)safeValueFromObject:(id)object forKey:(NSString *)key class:(Class)valueClass {
if (![object respondsToSelector:@selector(valueForKey:)]) {
return [[valueClass alloc] init];
}
id result = [object valueForKey:key];
return [result isKindOfClass:valueClass] ? result : [[valueClass alloc] init];
}
使用
NSString *text = @"";
id json = [NSJSONSerialization JSONObjectWithData:[data dataUsingEncoding:NSUTF8StringEncoding] options:0 error:nil];
id data = [self safeValueFromObject:json forKey:@"data" class:NSDictionary.class];
id value = [self safeValueFromObject:data forKey:@"value" class:NSArray.class];
id url = [self safeValueFromObject:value forKey:@"url" class:NSString.class];
text = url;