ios - 目标 C:如何在没有大量 if 语句的情况下检查对象类型
问题描述
我正在尝试将我的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 语句的情况下检查对象类型是否正确。任何提示或建议表示赞赏。
编辑:这是我的代码的精简版,但概念是一样的。
解决方案
在我看来,有两种方法可以让它看起来更整洁并忽略 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;
推荐阅读
- android - 为什么我的 Android NFC 扫描仪不工作
- swift - 如何在 Swift 中获取与字典中的键关联的直接值?
- jquery - 选择不是在 jquery 中选择值
- rest - 詹金斯 API 碎屑 403
- scala - 在 Scala 中是否有类型变量 'm forSome { type m[O] <: UpperBound[O] }` 的简写?
- python - 将python转换为cython时的变量类型
- vba - 使用 VBA 2 读取 COM 端口响应
- node.js - 依靠Nodejs的模块缓存来处理单个实例是否安全
- c++ - VS Code C++ 编译多个文件
- javascript - 如何使用 jquery 将元素的副本拖动到图像上?