0Pricing
Swift Academy · Ders

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:

  • CodingKeys tanımlayın, ardından init(from:) ve encode(to:) yöntemlerini uygulayın.
  • container(keyedBy:) ve encode/decode(_:forKey:) kullanın.
  • decodeIfPresent ile ?? birlikte kullanıldığında varsayılan değerler sağlar; nestedContainer JSON'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

  1. Yeniden Adlandırma için CodingKeys
  2. Anahtar ve Tarih Kod Çözme Stratejileri
  3. Elle encode(to:) ve init(from:)
  4. Heterojen JSON Kodunu Çözme
← Swift Academy Sayfasına Dön