我试图更好地理解解码器初始化器和 JSON 解码。此代码运行并产生预期结果:
let json = """
[
{
"firstName": "Jon",
"lastName": "Dough"
},
{
"firstName": "Jane",
"lastName": "Dough"
}
]
""".data(using: .utf8)!
struct Character: Codable {
var firstName: String
var lastName: String
enum CodingKeys: String, CodingKey {
case
firstName,
lastName
}
init(from decoder: Decoder) throws {
let data = try decoder.container(keyedBy: CodingKeys.self)
firstName = try data.decode(String.self, forKey: .firstName)
lastName = try data.decode(String.self, forKey: .lastName)
}
}
let decoder = JSONDecoder()
func doDecode() -> [Character] {
do {
var cast = try decoder.decode([Character].self, from: json)
return cast
} catch {
print("Error")
}
return []
}
let cast = doDecode()
print("# Cs \(cast.count)")
当我尝试添加辅助函数时,
extension Character {
private func tryDecode<T: Codable>(_ data: KeyedDecodingContainer<CodingKeys>, type: T.Type, forKey: CodingKeys, empty: T) -> T {
do {
let result = try data.decode(T.self, forKey: forKey)
return result
} catch { return empty }
}
}
我得到一个编译器错误:
初始化前使用的变量“self.firstName”
当我从初始化程序中调用它时:
firstName = tryDecode( data, type: String.self, forKey: Character.CodingKeys.firstName, empty: "")
我输入了“forKey:”,有和没有完整路径。同样的结果。
我做错了什么?为什么编译器不知道“forKey:”参数指的是枚举,而不是 self.firstName?
我在 Xcode playground 中运行最新的 Xcode 和 macOS 版本。