Codable in Swift: Customizing Encoding and Decoding for Maximum Efficiency
Swift, Apple tarafından geliştirilen ve kullanıcıların iOS, macOS, watchOS, tvOS ve diğer Apple platformlarında yazılım oluşturmasına yardımcı olan bir programlama dilidir. Swift, kolay kullanımı, derinlik ve çoklu platform desteğiyle tanınır. Swift’in en önemli özelliklerinden biri de Codable protokolüdür. Codable protokolü, Swift kullanıcılarının JSON veya XML verilerini kolayca yazma ve okuma işlemlerine olanak sağlar. Bu makalede, Swift’teki Codable protokolünü nasıl özelleştirebileceğinizi ve verilerinizi en etkili şekilde çözümleyebileceğinizi açıklayacağız.
Codable protokolü, Swift kodunu kolayca serileştirmek ve daha sonra tekrar çözümlemek için tasarlanmıştır. Basitçe, bir veri nesnesini JSON veya XML biçiminde saklamak ve daha sonra bu veriyi tekrar okumak için kullanabileceğiniz bir aracı oluşturur. Codable protokolünü kullanmak için, bir veri nesnesinin Encodable ve Decodable gibi iki temel protokole uyması gerekir. Bu protokoller, veri nesnesinin nasıl serileştirileceğini ve nasıl çözümleneceğini tanımlar.
Swift’teki Codable protokolü, kodunuzu özelleştirmenize izin verir. Özelleştirmenin temel yollarından biri, Encodable ve Decodable protokollerinin standart fonksiyonlarını değiştirmektir. Örneğin, bir veri nesnesini serileştirirken, veri nesnesinin hangi anahtar kelimeleri kullanılacağını ve hangi verilerin kullanılacağını değiştirebilirsiniz. Aynı şekilde, bir veri nesnesini çözümlerken, aynı anahtar kelimeleri kullanmanıza gerek olmadan çözümlemeyi özelleştirebilirsiniz.
Özelleştirme, kodunuzu daha etkili hale getirmenin yanı sıra, veri nesnelerinizi de daha etkin bir şekilde saklamanıza ve çözümlemenize olanak sağlar. Özelleştirmenin temel yolu, Encodable ve Decodable protokollerinin standart fonksiyonlarını değiştirmektir. Standart fonksiyonlarınızı, veri nesnenizin özel özelliklerini kontrol etmek ve veri nesnelerinizi özel bir biçimde serileştirmek ve çözümlemek için kullanabilirsiniz.
Örneğin, bir veri nesnesinin şu anda nasıl serileştirildiğini gösteren bir örnek kodu verin:
struct Person: Codable {
var name: String
var age: Int
}
let person = Person(name: "John Doe", age: 25)
let encoder = JSONEncoder()
let data = try encoder.encode(person)
print(String(data: data, encoding: .utf8)!)
// {"name":"John Doe","age":25}
Bu kodda, Person veri nesnesinin bir JSON verisine nasıl serileştirileceği gösterilmektedir. Person veri nesnesinin adının ve yaşının anahtar kelimeleri `name` ve `age` olarak kullanıldığını görebilirsiniz.
Ancak, özelleştirmek için, bu anahtar kelimelerinin değiştirilmesini isteyebilirsiniz. Örneğin, `name` anahtar kelimesini `fullName` olarak değiştirebilir ve `age` anahtar kelimesini `yearsOld` olarak değiştirebilirsiniz. Bunu yapmak için, Encodable ve Decodable protokollerinin standart fonksiyonlarını değiştirmeniz gerekir.
Bir Encodable ve Decodable protokolünün standart fonksiyonlarını değiştirmek için, `encode` ve `decode` fonksiyonlarını kendi fonksiyonlarınıza özel olarak yeniden adlandırmanız gerekir. Bu fonksiyonlarınızı yazdıktan sonra, Encodable ve Decodable protokollerini uygulayan veri nesnelerinizin başına `customCodingKeys` ve `customDecodingKeys` olarak adlandırılan iki özel anahtar eklemelisiniz. Bu iki anahtar, özelleştirmek için kullanılan anahtar kelimelerin listesini tutar.
Şimdi, Person veri nesnesini özelleştirelim. Öncelikle, `encode` ve `decode` fonksiyonlarını `encodeCustom` ve `decodeCustom` olarak yeniden adlandıralım. Ardından, `customCodingKeys` ve `customDecodingKeys` olarak adlandırılan iki özel anahtar ekleyelim.
struct Person: Codable {
var name: String
var age: Int
enum CodingKeys: String, CodingKey {
case fullName = "name"
case yearsOld = "age"
}
func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(name, forKey: .fullName)
try container.encode(age, forKey: .yearsOld)
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
name = try container.decode(String.self, forKey: .fullName)
age = try container.decode(Int.self, forKey: .yearsOld)
}
}
let person = Person(name: "John Doe", age: 25)
let encoder = JSONEncoder()
let data = try encoder.encode(person)
print(String(data: data, encoding: .utf8)!)
// {"name":"John Doe","age":25}
Bu kodda, Person veri nesnesinin özelleştirilmiş bir JSON verisine nasıl serileştirileceği gösterilmektedir. Anahtar kelimelerin `name` ve `age` olarak değiştirildiğini görebilirsiniz.
Swift’teki Codable protokolü, kodunuzu özelleştirmenize ve verilerinizi en etkili şekilde çözümlemenize olanak sağlar. Özelleştirmenin temel yollarından biri, Encodable ve Decodable protokollerinin standart fonksiyonlarını değiştirmektir. Standart fonksiyonlarınızı, veri nesnenizin özel özelliklerini kontrol etmek ve veri nesnelerinizi özel bir biçimde serileştirmek ve çözümlemek için kullanabilirsiniz.
Codable protokolünün özelleştirilmesi, veri nesnelerinizi daha etkin bir şekilde saklamanıza ve çözümlemenize olanak sağlar. Bu nedenle, kodunuzu daha etkili hale getirmek için özelleştirmeyi düşünmelisiniz.