İçeriğe geç

Swift ile Decodable ve CodingKey kullanımı

Merhabalar bu yazımda Swift ile servis üzerinden gelen JSON verisini kolay bir şekilde decode işlemi gerçekleştirerek nasıl kullanabileceğinizi göstereceğim.

Decodable protokolü bizlere gelen JSON çıktısını struct nesnesine dönüştürüp kullanmamızı kolaylaştırır. Buda bize gelen veriyi kolay bir şekilde uygulama içerisinde kullanmamızı sağlar.

İlk olarak basit bir JSON çıktısı kullanarak Decode işlemini gerçekleştirelim.

let postInfoJson = """
{
"name": "Kenan",
"surname": "Atmaca",
"id": 1,
"bio": "Bla Bla @_*"
}
"""

Gelen parametreleri karşılayacak bir struct model yaratalım.

struct UserModel: Decodable {
    var name:String?
    var surname:String?
    var id:Int?
    var bio:String?
}

Daha sonrasında bu işlemi JSONDecoder sınıfı yardımı ile hızlıca gerçekleştirelim.

if let jsonData = postInfoJson.data(using: .utf8) {
            do {
                let result = try JSONDecoder().decode(UserModel.self, from: jsonData)
                print(result.name) // "Kenan"
                print(result.id) // 1
            } catch {
                print(error)
            }
        }

Bu işlemin yanı sıra CodingKey kullanarak gelen parametre ismini değiştirip kullanabiliyoruz. Hemen bu işlemede bir örnek verelim.

Struct modelimizin içerisinde ekleyeceğiniz basit bir CodingKey protokolüne bağlı enum ve buna bağlı init işlemi ile olayı çözüyoruz.

let postInfoJson = """
{
"userName": "Kenan",
"userSurname": "Atmaca",
"id": 1,
"bio": "Bla Bla @_*"
}
"""
struct UserModel: Decodable {
    var name:String?
    var surname:String?
    var id:Int?
    var bio:String?
    
    enum CustomKeys: String, CodingKey {
        case name = "userName"
        case surname = "userSurname"
        case id
        case bio
    }
    
    init(from decoder: Decoder) throws {
        let decoderContainer = try decoder.container(keyedBy: CustomKeys.self)
        self.name = try decoderContainer.decode(String.self, forKey: .name)
        self.surname = try decoderContainer.decode(String.self, forKey: .surname)
        self.id = try decoderContainer.decode(Int.self, forKey: .id)
        self.bio = try decoderContainer.decode(String.self, forKey: .bio)
    }
}

Bu sayede farklı isimli parametre gelmesine rağmen isteğimiz şekilde verimizi uygulama içerisinde kullanabiliyoruz.

Tarih:SwiftSwift 4

İlk Yorumu Siz Yapın

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Copyright © 2020 Kenan Atmaca