JS转Swift时条件绑定初始化器非可选类型报错如何解决
直接报错原因
你定义的serializeProperty函数入参properties的类型是[Key: Value?],不属于可选类型,不能用guard let做可选绑定解包,这是触发当前报错的直接原因。
整体转译存在的其他错误
你的转译整体不符合原JS实现逻辑,还存在以下问题:
- 返回值类型不匹配:JS原方法返回的是元素为[Key, JsonValue|null]二元组的数组,你定义的返回值
[[Key: JsonValue?]]?是元素为字典的可选数组,类型完全不匹配,且入参非可选的情况下返回值也不需要设为可选。 - 逻辑实现错误:
- 声明的中间变量
data全程没有赋值,最终永远返回nil - 遍历字典的逻辑错误,
[Key: Value?]遍历得到的直接是(key: Key, value: Value?)元组,不需要嵌套循环 - 尝试修改只读的入参
properties,Swift的函数入参默认是let常量,不可直接修改,且你也不需要修改入参,直接处理后生成新的结果数组即可 - 原JS实现中
serializeValue无抛出异常的逻辑,不需要加try调用(除非你自己的Swift版serializeValue自定义了throws逻辑,否则不需要)
- 声明的中间变量
正确实现参考
// 先定义返回的元组类型,也可直接写返回值为[(Key, JsonValue?)] typealias SerializedPropertyEntry = (key: Key, value: JsonValue?) func serializeProperty(properties: [Key: Value?]) -> [SerializedPropertyEntry] { return properties.map { entry in guard let value = entry.value else { return (entry.key, nil) } return (entry.key, serializeValue(value: value)) } } // 对应serializeValue的Swift实现参考 func serializeValue(value: Value) -> JsonValue { switch value.type { case "string": return JsonValue(type: "string", value: value.value.toJson()) case "array_node": let mappedValues = value.value.map { $0.toJson() } return JsonValue(type: "array_node", value: mappedValues) default: // 兜底逻辑可根据你自己的JsonValue实际定义调整 return value as? JsonValue ?? JsonValue() } }
内容的提问来源于stack exchange,提问作者userNew
相关产品推荐
相关产品推荐

