Swift Extension: Nedir? Ne İşe Yarar?

Extension kullanarak kütüphanelere, sınıflara ve protokollere yeni özellikler kazandırmayı öğreniyoruz.

Swift Extension konusunu ele alırken şu konulara değineceğiz:

 

Nedir?

Extension kelime anlamı olarak genişletme anlamına gelmektedir. Extension ile var olan yapılara yeni özellikler ekleriz.

Var olan yapılar Apple ın bize sunduğu UIButton, UIView, UIViewController gibi native komponentler olabilirken aynı zamanda bizim inşa ettiğimiz yapılar da olabilir.

 

Ne İşe Yarar?

Extensions aynı veri türüne ait özellikleri genişletmemizi sağlayan bir yapıdır.

Örneğin bir Date objemiz var ve bunu Gün-Ay-Yıl şeklinde formatlamak istiyoruz. Bu durumda eğer genişletme özelliğini bilmiyorsak muhtemelen Controller sınıfının içinde şöyle bir fonksiyon yazardık:

Peki başka bir sınıf içinde benzer bir tarih formatlama işi olsaydı aynı fonksiyonu kopyalayıp diğer sınıfa mı yapıştıracaktık? Aynı fonksiyonu neden farklı sınıflarda görelim? O zaman kodumuz redundancy kokmaz mı?

Bunları yapmak yerine Date sınıfına bir Extension yazmalı Date sınıfının özelliklerini genişleten fonksiyonları buraya eklemeliyiz. Böylece kodumuz daha temiz ve kolay yönetilebilir bir hale gelecektir.

 

Nasıl Yaratılır?

Extension yaratmak için yapının başına Extension kelimesini yazarız. Eğer UIView sınıfı için bir Extension oluşturmak istiyorsak:

yazmamız yeterlidir. Bunu projenizde Extensions isminde bir klasör oluşturup yazacağınız her extension için ayrı bir swift dosyası yaratıp yapmanızı tavsiye ediyorum.

 

Extension vs Helper Class

Yeniden kullanacağımız fonksiyonları bir Helper sınıfı yaratıp oradan da çağırabilirdik. Neden Extension kullanıyoruz?

Ayrım şurada:

Eğer bir Helper fonksiyonu yazarsak:

projenin her yerinden çağırılabilen ortak bir fonksiyon yaratmış oluruz fakat bu fonksiyon herhangi bir sınıfa yapıya veya protokole yeni özellikler kazandırmaz. Bu Helper fonksiyonuna erişmek için

ifadesini kullanırız.

Öte yandan Extension bir sınıfa, protokole veya enumeration a yeni özellikler katmak için yazılır; sadece bütün projeden erişilebilen bir fonksiyon olsun diye değil.

Eğer elimizde date isminde bir Date objesi varsa,

ifadesini kullanabiliriz. Böylelikle Date sınıfına yeni bir özellik kazandırmış oluruz.

Yani Extension Helper sınıfından daha iyi veya kötü diye bir şey yok; kullanım alanları farklı.

 

Kullanım Alanları

Extension kullanım alanları ile ilgili olarak var olan türlere yeni fonksiyonlar kazandırma örneğini vermiştim ama kullanım alanları

Ayrıca:

olabilmektedir. Şimdi bunların üzerinden geçelim:

 

Computed Type Properties

Bu kullanım alanında varsayılan olarak bize sunulan değişkenlere yenilerini ekleriz. Örneğin myVar isminde Double türünde bir değişkenimiz var.

Bu değişkenin property lerini şekildeki gibi görüyoruz. Double veri türüne yeni property ler kazandırmak istediğimizde Double sınıfı için bir genişletme pekala yazabiliriz.

Örnekteki gibi Double sınıfını genişlettiğimizde elimizdeki Double tipindeki myVar değişkenini

şeklinde kullanabilir hale geliyoruz.

 

Protocols

Protokoller için de genişletme modülü yazılabilmektedir. Protokol için yazdığımız Extension sayesinde delegation fonksiyonlarını opsiyonel yapabilir ve bu fonksiyonları protokolü implement ettiğimiz sınıfta kullanmayabiliriz.

Konu ile alakalı olarak Delegates and Protocols in Swift yazıma göz atabilirsiniz.

 

Clean Code

Bazen ise kodumuzu sadece basitçe yönetilebilir alt bölümlere ayırmak isteriz. Örneğin sınıfımızda bir genişletme tanımlayıp sınıf metodlarını bu bölümde yazabiliriz:

Veya uyacağımız herhangi bir protokol için genişletme modülü yazabiliriz:

 

Sonuç

Sonuç olarak Extension yapısının ne olduğunu, ne işe yaradığını, nasıl yaratıldığını, Helper ile arasındaki farkını ve kullanım alanlarını öğrendik.

Başka bir yazıda görüşmek üzere.