Swift Codable: Encodable - Decodable

Merhaba bugün Swift’de URLSession Network İşlemleri'nde JSON olarak gelen datayı custom Swift “struct” yada “class”lara map’leme işlemine yakından göz atacağız.


Swift’de “Codable” JSON’ları bir nesneye, nesneleri ise JSON yapılarına dönüştürmemize yardımcı olan bir protokoldür. Kullanacağımız yapıların (struct) veya sınıfların (class) bu işlemleri gerçekleştirebilmek için bu protokolü uygulaması (implement etmesi) gerekir.


Görsel Referansı


İlk olarak JSON kavramından bahsetmek gerekirse JSON (JavaScript Object Notation) bizler tarafından okunması kolaylaştırılmış, verileri depolamak ve taşımak için bir formattır. Ayrıca restful çağrımız sonrasında bize dönen response(yanıt) JSON formatında olabilir.


Yapacağımız örnekte bir yapı oluşturalım. İlk öncelikle bu yapıdan bir nesne oluşturarak bilgilerini “encode” edip bir JSON’a dönüştürelim. Ardından da oluşan bu JSON’ı “decode” ederek bilgileri başka bir nesneye aktaralım.


İşlemlerimize başlamadan önce “encode” ve “decode” kavramlarına biraz yakından bakalım.


Encode Nedir?

  • Çoğu iOS uygulamasında verileri kaydetmemiz ve ağ üzerinden göndermemiz gerekir. Ancak bunu yapmadan önce, verileri “encoding” veyaserialization” adı verilen bir işlemle uygun bir formata dönüştürmeniz gerekir.


Görsel Referansı


Decode Nedir?

  • Ayrıca uygulamamızda kullanmadan önce ağ üzerinden aldığımız verileri Swift kodumuzda kullanılabilir bir hale dönüştürmeniz gerekir. Bu ters işlem, “decoding” veya “deserialization” olarak adlandırılır.


Görsel Referansı

Hazırsanız başlayalım.


İlk olarak basit bir struct yapısı oluşturalım. Struct’ımız içinde String türünde, “name” ve “date” adında iki adet değişken oluşturalım.


Asıl önemli nokta ise Struct’ımıza uyguladığımız “Codable” protokolü. Codable protokolü “Encodable” ve “Decodable” ikilisini kapsayan, iki protokolün özelliklerini de barından bir üst seviye protokoldür. Bir Struct/Class’a Encodable’ı implement ederseniz sadece Encodable özellikleri geçerli olacaktır ancak “Codable” implement edersek her iki protokolün özelliklerini de Struct/Class’a uygulayacaktır.

Biz bu sınıfta “Encodable” ve “Decodable” işlemlerini beraber yapacağımız için “Codable” protokolünü direkt uyguladık. Ancak“Codable” yerine “Encodable & Decodable” şeklinde de tanımlayabiliriz.



Ardından nesnemizi yaratarak devam edelim.

let horoscope1 : Horoscope = Horoscope(name: "Virgo", date: "August 23 – September 22")

Encode işlemi


Şimdi nesnemizi bir JSON’a dönüştürecek olan encode işlemine başlayalım. Burada bir encoder nesnesi yaratarak işlemimize başlıyoruz. Ardından JSON’ımızı tanımlayıp, encoder ile JSON’a değerini atıyoruz. Burada encode methodu bize hata fırlatabileceği için hata yönetim yapısı kullanmamız gerekiyor. Ardından json’ı görebilmek için String’e çevirerek ekrana print ediyoruz.


Ardından ekranda göreceğimiz çıktı şu şekilde olacaktır:


Sonuç başarılı fakat okunabilirliği düşük bir sonuç bizim için. Eğer konsola log bastıracaksanız okunabilirliği (readability) artırmak adına prettyPrintingkullanabiliriz.

Bu sayede çok daha okunaklı bir sonuç elde ettiğimizi görebiliriz.

Decode işlemi


Şu ana kadar, Swift’in custom yapılarını JSON’a çevirdik. Gelin şimdi beraber, JSON’dan Swift’in custom yapılarına çevirmeye yani “Decode” işlemine bakalım. Encode’da olduğu gibi burada da bir decoder nesnesi yaratarak işleme başlayacağız. Ardından decoder ile json verimiz ile belirlediğimiz tipte bir nesne yaratıp ve ekranda nesnemize ait değerleri göreceğiz.



Ardından ekranda göreceğimiz:

[EKSTRA] CodingKey  —  Farklı Keywordleri Map’leme


Sunucumuzdaki parametrelerin naming conventionu ile Swift’tekiler bir olmayacaktır. Örneğin sunucumuzdan

{
"created_at" : "XYZ"
}

gibi gelen bir datayı, Swift conventionlarına uymak isterseniz “created_at” fieldını bu isimle kullanmamanız gerekir. Sunucudan gelen bu datanın karşılığı şu olacaktır:


struct ServerData {
  let createdAt: String
}

Burada gördüğünüz gibi sunucudaki field name ile sizdeki aynı değil. Codable’ın çalışma prensibi, implemente edilen yapıdaki naminglerin aynı olmasıdır. Ancak namingler farklı ise ne yapacağız? İşte burada CodingKey devreye giriyor. Struct’ımızın içinde bir enum oluşturuyoruz ve CodingKey protokolünü ekliyoruz.

struct ServerData {
  let createdAt: String
  enum CodingKeys: String, CodingKey {
    case createdAt= "created_at"   
  }
}

Bu yapı sayesinde artık JSON’ımızı planlandığı gibi kodunu çözebileceğiz.


Yazımızın sonuna geldik. Sizlere Codable (Encodable & Decodable) protokolünü özetlemeye çalıştım. Umarım anlaşılır olmuştur. 🤓


Kodların tamamına buradan ulaşabilirsiniz.


Referanslar:


#ios #swift #codable #encodable #decodable #codingkey

0 yorum

Son Paylaşımlar

Hepsini Gör

Komünite

Platform

Mobiler.dev Anasayfa
  • Twitter
  • Instagram
  • development_düzenlendi_düzenlendi
  • Youtube
  • slack-icon-black_edited_edited_edited
  • Gri LinkedIn Simge
imageedit_2_9667998092.png
JetBrains Hakkında Detaylı Bilgi Alın

© 2021 by mobiler.dev

Kurumsal Yazar Hesapları

adesso.png
mobilerdevLogo.jpg
Yazarlık Başvurusu Hakkında Bilgi Alın, Başvuru Yapın.
Topluluk Yazarlarını Tanıyın