Danh sách các khóa để mã hóa / giải mã được điều khiển bởi một loại được gọi là CodingKeys
(ghi chú s
ở cuối). Trình biên dịch có thể tổng hợp điều này cho bạn nhưng luôn có thể ghi đè điều đó.
Giả sử bạn muốn loại trừ thuộc tính nickname
khỏi cả mã hóa và giải mã:
struct Person: Codable {
var firstName: String
var lastName: String
var nickname: String?
private enum CodingKeys: String, CodingKey {
case firstName, lastName
}
}
Nếu bạn muốn nó không đối xứng (tức là mã hóa nhưng không giải mã hoặc ngược lại), bạn phải cung cấp các triển khai của riêng mình encode(with encoder: )
và init(from decoder: )
:
struct Person: Codable {
var firstName: String
var lastName: String
var fullName: String {
return firstName + " " + lastName
}
private enum CodingKeys: String, CodingKey {
case firstName
case lastName
case fullName
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
firstName = try container.decode(String.self, forKey: .firstName)
lastName = try container.decode(String.self, forKey: .lastName)
}
func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(firstName, forKey: .firstName)
try container.encode(lastName, forKey: .lastName)
try container.encode(fullName, forKey: .fullName)
}
}
CodingKeys
enum là đủ.