Swift解析含ValueUnion联合类型的JSON后无法遍历address数组求助
问题根因
你用在线工具生成的ValueUnion是枚举类型,不同类型的值被包装在枚举的关联值中,不能直接用as?强转提取关联值,必须用枚举的模式匹配来取值。
可行解决方案
方案1:用Switch全分支处理(推荐,覆盖所有类型不会漏)
把你原来的遍历逻辑替换成以下代码:
print("onboardingStatus: \(result?.Greeting ?? "")") print("idService: \(result?.Service ?? "")") guard let userData = result?.data else { return } for item in userData { print("key: \(item.key)") switch item.value { case .string(let value): // 处理字符串类型的value(email、name等字段走这个分支) print("value: \(value)") case .valueElementArray(let addressArray): // 处理数组类型的value(address字段走这个分支) print("address 明细:") for addressItem in addressArray { print(" \(addressItem.key): \(addressItem.value)") } } }
方案2:单独匹配address字段
如果你只需要单独处理address字段,不需要处理其他字段,也可以用if case模式匹配:
print("onboardingStatus: \(result?.Greeting ?? "")") print("idService: \(result?.Service ?? "")") guard let userData = result?.data else { return } for item in userData { print(item.key) // 匹配address的数组value if item.key == "address", case .valueElementArray(let addressInfo) = item.value { for ad in addressInfo { print(ad.key) print(ad.value) } } else if case .string(let strValue) = item.value { // 其他字段的字符串value输出 print(strValue) } }
优化方案:加扩展简化后续取值
可以给ValueUnion加扩展,封装关联值的提取逻辑,后续使用更方便:
extension ValueUnion { /// 快速获取字符串类型的value var stringValue: String? { guard case .string(let val) = self else { return nil } return val } /// 快速获取数组类型的value var addressArray: [ValueElement]? { guard case .valueElementArray(let val) = self else { return nil } return val } }
加完扩展后你原来的代码只要修改强转那一行即可正常运行:
// 把原来的guard let address_info = item.value as? [ValueElement] else { return } // 替换成下面的代码 guard let address_info = item.value.addressArray else { return }
内容的提问来源于stack exchange,提问作者Sathya Baman
相关产品推荐
相关产品推荐

