एन्कोड / डिकोड करने के लिए कुंजियों की सूची को एक प्रकार से नियंत्रित किया जाता है जिसे कहा जाता है CodingKeys
( s
अंत में ध्यान दें )। संकलक आपके लिए इसे संश्लेषित कर सकता है लेकिन हमेशा इसे ओवरराइड कर सकता है।
मान लें कि आप संपत्तियों nickname
को एन्कोडिंग और डिकोडिंग दोनों से बाहर करना चाहते हैं :
struct Person: Codable {
var firstName: String
var lastName: String
var nickname: String?
private enum CodingKeys: String, CodingKey {
case firstName, lastName
}
}
यदि आप इसे असममित होना चाहते हैं (अर्थात एनकोड करें लेकिन डीकोड या इसके विपरीत नहीं), तो आपको अपना स्वयं का कार्यान्वयन प्रदान करना होगा encode(with encoder: )
और 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
पर्याप्त है।