Elle encode(to:) ve init(from:)
Serileştirme mantığını tamamen denetleyin.
Elle encode(to:) ve init(from:), CoddyKit'te ücretsiz bir Swift Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Swift Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Swift Academy kursu toplamda 4 dersten oluşur.
Otomatik Üretim Yeterli Olmadığında
Bazen JSON yapısı özelliklerinizle örtüşmez — hesaplama dönüşümlerine, varsayılan geri dönüş değerlerine veya düzleştirmeye ihtiyaç duyarsınız. Bu durumda encode(to:) ve init(from:) yöntemlerini elle uygularsınız.
import Foundation
struct Temperature: Codable {
var celsius: Double
}
print("Manual coding gives full control")Önce CodingKeys Tanımlama
Elle kodlama, bir CodingKeys numaralandırmasıyla başlar. Anahtarlı kapsayıcılar, değerleri okumak ve yazmak için bu anahtarları kullanır.
import Foundation
struct User {
var name: String
var age: Int
enum CodingKeys: String, CodingKey {
case name
case age
}
}
print(User.CodingKeys.name.stringValue)init(from:) Uygulama
init(from decoder:), container(keyedBy:) ile anahtarlı bir kapsayıcı alır ve ardından her özelliğin kodunu kendi anahtarına göre çözer.
import Foundation
struct User: Decodable {
var name: String
var age: Int
enum CodingKeys: String, CodingKey { case name, age }
init(from decoder: Decoder) throws {
let c = try decoder.container(keyedBy: CodingKeys.self)
name = try c.decode(String.self, forKey: .name)
age = try c.decode(Int.self, forKey: .age)
}
}
let u = try JSONDecoder().decode(User.self, from: "{\"name\":\"Ada\",\"age\":36}".data(using: .utf8)!)
print(u.name, u.age)encode(to:) Uygulama
encode(to encoder:), container(keyedBy:) ile değiştirilebilir bir anahtarlı kapsayıcı alır ve her özelliği encode(_:forKey:) ile yazar.
import Foundation
struct User: Encodable {
var name: String
var age: Int
enum CodingKeys: String, CodingKey { case name, age }
func encode(to encoder: Encoder) throws {
var c = encoder.container(keyedBy: CodingKeys.self)
try c.encode(name, forKey: .name)
try c.encode(age, forKey: .age)
}
}
let data = try JSONEncoder().encode(User(name: "Ada", age: 36))
print(String(data: data, encoding: .utf8)!)Elle Eksiksiz Codable
Her iki yöntemi de uygulamak, türü her iki uçta özel mantığa sahip tam bir Codable türüne dönüştürür.
import Foundation
struct Point: Codable {
var x: Int
var y: Int
enum CodingKeys: String, CodingKey { case x, y }
init(x: Int, y: Int) { self.x = x; self.y = y }
init(from d: Decoder) throws {
let c = try d.container(keyedBy: CodingKeys.self)
x = try c.decode(Int.self, forKey: .x)
y = try c.decode(Int.self, forKey: .y)
}
func encode(to e: Encoder) throws {
var c = e.container(keyedBy: CodingKeys.self)
try c.encode(x, forKey: .x)
try c.encode(y, forKey: .y)
}
}
let back = try JSONDecoder().decode(Point.self, from: try JSONEncoder().encode(Point(x: 1, y: 2)))
print(back.x, back.y)Varsayılan Değerler Sağlama
Bir anahtar eksik olduğunda hata fırlatmak yerine varsayılan bir değer sağlamak için decodeIfPresent ile nil birleştirme işleciyi kullanın.
import Foundation
struct Settings: Decodable {
var theme: String
enum CodingKeys: String, CodingKey { case theme }
init(from decoder: Decoder) throws {
let c = try decoder.container(keyedBy: CodingKeys.self)
theme = try c.decodeIfPresent(String.self, forKey: .theme) ?? "light"
}
}
let s = try JSONDecoder().decode(Settings.self, from: "{}".data(using: .utf8)!)
print(s.theme)Değerleri Dönüştürme
Elle kod çözme, ham JSON'u daha zengin bir gösterime dönüştürmenizi sağlar — burada Fahrenheit girdisi Celsius olarak saklanır.
import Foundation
struct Reading: Decodable {
var celsius: Double
enum CodingKeys: String, CodingKey { case fahrenheit }
init(from decoder: Decoder) throws {
let c = try decoder.container(keyedBy: CodingKeys.self)
let f = try c.decode(Double.self, forKey: .fahrenheit)
celsius = (f - 32) * 5 / 9
}
}
let r = try JSONDecoder().decode(Reading.self, from: "{\"fahrenheit\":212}".data(using: .utf8)!)
print(r.celsius)İç İçe JSON'u Düzleştirme
nestedContainer(keyedBy:forKey:) ile iç içe bir kapsayıcı okuyabilir ve değerlerini düz bir Swift yapısına taşıyabilirsiniz.
import Foundation
struct Profile: Decodable {
var city: String
enum Keys: String, CodingKey { case address }
enum AddressKeys: String, CodingKey { case city }
init(from decoder: Decoder) throws {
let c = try decoder.container(keyedBy: Keys.self)
let a = try c.nestedContainer(keyedBy: AddressKeys.self, forKey: .address)
city = try a.decode(String.self, forKey: .city)
}
}
let json = "{\"address\":{\"city\":\"Rome\"}}"
let p = try JSONDecoder().decode(Profile.self, from: json.data(using: .utf8)!)
print(p.city)İç İçe Kapsayıcıya Kodlama
Kodlama işlemi bunun tersini de yapabilir: düz bir yapıyı nestedContainer(keyedBy:forKey:) kullanarak iç içe bir JSON nesnesi olarak yazabilirsiniz.
import Foundation
struct Profile: Encodable {
var city: String
enum Keys: String, CodingKey { case address }
enum AddressKeys: String, CodingKey { case city }
func encode(to encoder: Encoder) throws {
var c = encoder.container(keyedBy: Keys.self)
var a = c.nestedContainer(keyedBy: AddressKeys.self, forKey: .address)
try a.encode(city, forKey: .city)
}
}
let data = try JSONEncoder().encode(Profile(city: "Rome"))
print(String(data: data, encoding: .utf8)!)Kod Çözerken Doğrulama
init(from:) yalnızca bir başlatıcı olduğundan, değerleri doğrulayabilir ve aralık dışındalarsa özel bir hata fırlatabilirsiniz.
import Foundation
struct Score: Decodable {
var value: Int
enum CodingKeys: String, CodingKey { case value }
init(from decoder: Decoder) throws {
let c = try decoder.container(keyedBy: CodingKeys.self)
let v = try c.decode(Int.self, forKey: .value)
guard (0...100).contains(v) else {
throw DecodingError.dataCorruptedError(forKey: .value, in: c, debugDescription: "out of range")
}
value = v
}
}
let s = try JSONDecoder().decode(Score.self, from: "{\"value\":80}".data(using: .utf8)!)
print(s.value)Elle Yazılan ve Otomatik Üretilen Kodlamayı Birleştirme
Bir tür, yalnızca bir yöntemi elle uygulayıp diğerini derleyicinin otomatik üretmesine izin verebilir — örneğin özel bir init(from:) ile otomatik üretilen kodlama birlikte kullanılabilir.
import Foundation
struct Flag: Codable {
var on: Bool
enum CodingKeys: String, CodingKey { case on }
init(from decoder: Decoder) throws {
let c = try decoder.container(keyedBy: CodingKeys.self)
on = (try? c.decode(Bool.self, forKey: .on)) ?? false
}
init(on: Bool) { self.on = on }
}
let data = try JSONEncoder().encode(Flag(on: true))
print(String(data: data, encoding: .utf8)!)Hızlı Kontrol: Elle Kodlama
Elle yazılmış Codable yöntemleri konusundaki anlayışınızı sınayın.
Özet: Elle encode(to:) ve init(from:)
Kodlama üzerinde tam denetim sağlamayı öğrendiniz:
CodingKeystanımlayın, ardındaninit(from:)veencode(to:)yöntemlerini uygulayın.container(keyedBy:)veencode/decode(_:forKey:)kullanın.decodeIfPresentile??birlikte kullanıldığında varsayılan değerler sağlar;nestedContainerJSON'u düzleştirir veya iç içe yerleştirir.- Değerleri doğrulayabilir, dönüştürebilir ve elle yazılmış yöntemleri otomatik üretilenlerle birleştirebilirsiniz.
Sıkça Sorulan Sorular
“Elle encode(to:) ve init(from:)” dersi ücretsiz mi?
Evet — “Elle encode(to:) ve init(from:)” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Swift Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Swift Academy kursu toplamda 4 dersten oluşur.
“Elle encode(to:) ve init(from:)” dersinde ne öğreneceğim?
Serileştirme mantığını tamamen denetleyin. Swift Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Swift Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Swift Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.
“Elle encode(to:) ve init(from:)” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Swift Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Swift Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Yeniden Adlandırma için CodingKeys
- Anahtar ve Tarih Kod Çözme Stratejileri
- Elle encode(to:) ve init(from:)
- Heterojen JSON Kodunu Çözme