Swift中如何将RawJSON数组解码还原为原生字符串数组
报错原因
- 类型不匹配:遍历得到的
item是RawJSON枚举类型,目标数组是[String]原生字符串数组,两种类型不能直接赋值、追加。 - 语法错误:原代码用
let声明arrayString,定义的是不可变数组,本身就不支持调用append方法修改。
正确转换方法
安全转换(推荐)
使用compactMap配合模式匹配提取.string分支的关联值,即使数组中混入数字、布尔值等其他类型的RawJSON元素也不会崩溃:
let rawJSONArray = [RawJSON.string("A"), RawJSON.string("B"), RawJSON.string("C")] let stringArray = rawJSONArray.compactMap { item -> String? in guard case let .string(value) = item else { return nil } return value } // 最终得到原生字符串数组["A", "B", "C"]
循环写法修正版
如果习惯用遍历逻辑,注意把数组声明为可变的var,追加前提取枚举中包裹的原生字符串值:
let rawJSONArray = [RawJSON.string("A"), RawJSON.string("B"), RawJSON.string("C")] var arrayString: [String] = [] for item in rawJSONArray { if case let .string(value) = item { arrayString.append(value) } }
简化调用扩展
如果项目中频繁需要从RawJSON取原生值,可以加扩展简化代码:
extension RawJSON { var stringValue: String? { guard case let .string(value) = self else { return nil } return value } // 可按需扩展numberValue、boolValue、arrayValue等其他类型快速取值属性 }
加完扩展后转换代码可以简化为一行:
let stringArray = rawJSONArray.compactMap(\.stringValue)
内容的提问来源于stack exchange,提问作者Shehroz Saleem
相关产品推荐
相关产品推荐

