CustomStringConvertible Nedir ? Ne İşe Yarar ? [Swift]

Emre Celebi
NSIstanbul
Published in
3 min readMar 28, 2020

A type with a customized textual representation. [developer.apple.com]

Photo by Medhat Dawoud on Unsplash

Seviye: Başlangıç

Merhabalar, yeni başlayanlar için yararlı olacağını düşündüğüm bir protokolü basit bir örnek üzerinden açıklayacağım bu yazının sloganı: It’s easy and useful.

Android Geliştirici’ler için ufak bir not:
Android’den IOS’a geçtiğimde nerede bu .toString() methodu demiştim. (Oh my god, classdaki değişkenlerimi tek tek mi print edeceğim.😨) Android’cilerin bileceği üzere oluşturduğumuz bir class’ta .toString() methodunu override edip class’taki tüm değişkenleri Log’a tek tek basmaktan kurtuluyor ve istediğimiz gibi özelleştirme yapabiliyoruz. Tabi tek amacımız Log basmak değil farklı amaçlar içinde kullanabiliriz. .toString()’in Swift’teki karşılığı CustomStringConvertible protokolü.

Hadi Başlayalım!

Öncelikle “CustomStringConvertible protokolünü kullanmasak ne olur ki ?” sorusunu cevaplayalım. Person adında bir class oluşturarak başlıyoruz.

Person.swift

Daha sonra bir instance alıp print etmeyi deneyelim.

let person = Person("Emre", "Celebi", 26)
print(person)
Print ettikten sonra elde ettiğimiz sonuç pekte tatmin edici değil sanki. 🤔

Ee ne olmuş yani bir method yazar her şeyi print ederim dediğinizi duyar gibiyim. 🗣

Fake toString

Evet yapılabilir, ama bu seferde sürekli person.toString() şeklinde method çağırmanız gerekiyor. ( Like Android — Java )

let person = Person("Emre", "Celebi", 26)
print(person.toString())
##Printed##
firstName: Emre
lastName: Celebi
age: 26

Peki bunun daha kolay bir yolu yok mu ? Evet bayanlar baylar bu elimde gördüğünüz ürün … 💪🏼

CustomStringConvertible

Bu protokolü uygulayan classların uyması gereken bir tek kural var, description değişkenini override etmek. CustomStringConvertible protokolünü implement ettiğinizde XCode size bir uyarı çıkaracaktır. 😱

Type ‘Person’ does not conform to protocol ‘CustomStringConvertible’

description değişkenini override edip içini istediğimiz şekilde dolduruyoruz.

Şakir mi ? Ne Şakiri!

Bişeyi farkettiniz mi ? print(person) yeterli oldu. ☺️ person.description yazmama gerek yok. Class’ımızın son hali şöyle bir şey oldu.

Person.swift
print(person)

Biraz daha ileri gidelim!

Her şey iyi güzel ama ben her classta description mu yazacağım ? 🤔
Yogev Sitton’ın bloğunda bununda çözümü var. 🙂

Kısaca örneklemem gerekirse, bir extension yazacağız ve her classta description yazmaktan kurtulacağız. Bunu yaparken Mirror adında bir struct kullanacağız. Mirror hakkında detaylı bilgi için buraya yada buraya tıklayabilirsiniz.

CustomStringConvertible+Extension.swift

Artık CustomStringConvertible protokolünü uygulamak yeterli. Tekrar tekrar description değişkenini override etmeye gerek kalmadı.
Classımız şu şekilde:

let person = Person("Emre", "Celebi", 26)
print(person)
##Printed##
Class Name: Person
firstName: Emre
lastName: Celebi
age: 26

CustomStringConvertible protokolünü kullanmanın basit ve kullanışlı olduğunu açıklamaya çalıştım.

Okuduğunuz için teşekkür ederim. Umarım faydası olmuştur. Görüşmek üzere..

--

--