我正在努力更好地理解解码器初始化器和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)")
当我try 添加助手函数时,
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’
当我从初始值设定项调用它时:
init(from decoder: Decoder) throws {
let data = try decoder.container(keyedBy: CodingKeys.self)
firstName = tryDecode(data, type: String.self, forKey: Character.CodingKeys.firstName, empty: "")
lastName = tryDecode(data, type: String.self, forKey: Character.CodingKeys.lastName, empty: "")
}
我输入了带有和不带有完整路径的"Forkey:".结果是一样的.
我做错了什么?为什么编译器不知道"Forkey:"参数引用的是枚举,而不是self.firstName?
我正在Xcode操场上运行最新发布的Xcode&;MacOS操作系统.