Swift Extensions Nedir? Swift Extensions Örnekleri

Merhaba arkadaşlar, Swift dersleri serimize Swift Extensions (Eklentiler) ile devam ediyoruz. Extensions var olan classlara, structlara, enumlara ve protokollere yeni işlevler ekleyebilmemize olanak verir ve yazdığımız kodu daha anlaşılır hale getirir. Extensionları iki farklı tipte inceleyeceğiz. Bir tanesi classları parçalayabilmemizi sağlayan özellikleri, bir diğeri ise Swift componentlerine metotlar ekleyerek bu metotlara proje içinde herhangi bir yerden erişmemizi sağlayan özelliği. Başlamadan önce Swift Inheritance yazısını okumanın faydalı olacağını söylemek isterim.

Swift Extensions Syntax

Extensions yazarken “extension” anahtar kelimesini kullanırız. Örnek üzerinden gidelim:

“extension” parametresinden sonra extend edeceğimiz yapıyı belirtiriz. Yukarıdaki ilk örnek bir class’a extension yazıp class’ı genişletmek için örneğin yeni init methodları, yeni methodlar ve parametreler tanımalamak için,  ikinci örnek ise class a bir protocol ü implement etmek için kullanılır.

Extensions bir yapıya generic bir metot veya özellik eklemek istediğimizde çok kullanışlı olmaktadır. Örnek vermek gerekirse:

 Yukarıdaki örnekte Int için yazdığımız bir extension bulunmaktadır. Bu extension sayesinde int bir para değerinin kaç kuruş olduğunu öğrenebiliriz. Büyük bir projede çalıştığımızı var sayalım ve para birimlerini kuruşa çevirmemiz gereken durumlar var. Eğer yukarıdaki gibi bir extension yazar isek bir int değeri ile kurus özelliğini çağırabiliriz.

Extension yazmadığımız durumda ise her seferinde değeri yüz ile çarpmamız gerekmektedir. Burada yaptığımız işlem basit bir matematiksel işlem ancak, örneğin 10 satır koddan oluşan bir fonksiyon olduğunu düşünelim; bu fonksiyonu farklı classlarda çağırabilmek için her classın içine bu fonksiyonu eklememiz gerekmektedir. Ancak int extension yazdığımızda proje içerisinde herhangi bir classtan erişebiliriz. Bir defa yazıp her yerde kullanabiliriz.

Swift Extensions ile neler yapabiliriz?

  • Extensions içine computed property ekleyebiliriz.

Ekelediğimiz computed propertyler sayesinde eklediğimiz sınıfın nesneleri vasıtasıyla bu propertylere erişebiliriz.

  • Extensions içine metot ekleyebiliriz.

Int için yazdığımız extension içine bir adet de metot ekledik ve bu metot da int değerimizin birler basamağındaki sayıyı döndürüyor.

  • Extensions içine yapıya ait yeni bir veya birden fazla init() metodu yazabiliriz.

 

  • Extensions ile bir yapıya protokoller ekleyebiliriz.
  • extension kullanarak kodu bir veya birden fazla parçaya  ayırabiliriz ve bu parçaladığımız classın, structın vb.  yapısında herhangi bir değişikliğe sebep olmaz.

Kodu parçalayarak okunurluğunu artırabiliriz. Özellikle bir classımızın kod satır sayısı çok fazla ise birbiriyle bağlantılı metotları aynı extension içine alıp kodu bir kaç defa bölmek kodun anlaşılırlığını artıracaktır. Aşağıda parçaladığım bir class örneği bulunmaktadır.

Yukarıda class gövdesi haricinde iki adet extension ile classı böldük çünkü class gövdesi artmaya başlasa bile artık ben tableview ve protokol metotlarımı ayrı bir alanda tutuyorum istediğim zaman rahatlıkla bunlara erişebilirim. Bu şekilde classın gövdesinden birbiriyle alakalı olan metotları extensionlar içinde toplamış olduk.

Örnek Extensions Kullanım Şekilleri

1- Swift componentlerine fonksiyonlar ekleyerek aynı işi yapan fonksiyonları tek bir yerden yönetmiş oluruz.

Yukarıda Int değerler için bir extension ekledik. Bu extension  kareAl() adında bir metot bulunduruyor. Bu metot gelen int değerin karesini geri döndürüyor. Bu fonksiyonu istediğimiz int değer için projenin herhangi bir yerinden çağırabilmemiz bize çok kolaylık sağlamaktadır. Şimdi farklı bir metot daha yazalım:

topla() metodumuz iki int değeri toplayan bir metoddur. Dikkat ettiyseniz metodu çağırdığımız parametreleri “self” değeri olarak okuyoruz. kareAl() metodunda self değerimiz 5 idi topla() metodunda ise metodu 7 ile çağırdığımız için self değerimiz 7 oldu. Bu metodlara çıkarma, bölme ve çarpma işlemlerini ekleyerek 4 işlemi yapan metodları barındıran bir int extension yapıp, projeniz içerisinde bu metodları rahatlıkla kullanabilirsiniz.

İki string değeri birbirine ekleyen stringConcat() metodu ve nasıl çağrıldığını yukarıda görebiliriz.

içinde farklı tipten elemanlar olanın bir dizinin int değerlerinin toplamını toplamiBul() metodu vasıtasıyla bulabiliriz.  Arrayimizin elemanlarının tipi belli olmadığı için her seferinde yeni gelen elemanın int olup olmadığını( “let intItem = item as? Int ?? 0 “)kontrol etmeliyiz. Eğer elemanımız int değilse 0 elemanımızın değeri 0 olsun dedik.

2- TableView, collectionView vb. yapıların delegate, datasource vb fonksiyonlarını extension ile classtan ayrılabilir.

3- iOS proje içindeki UIKit componentlerine extension yazılabilir. Özellikle  UIButton, UIView vb componentlerin proje içinde çok fazla kullanılabilecek bazı özellikleri için  yazılabilir.

@IBInspectable parametresi, UIView için yazdığımız extension içindeki cornerRadius (view’ın köşelerini yuvarlak yapar) parametresini storyboard içinde değiştirebilmemizi sağlar. Storyboard ile tasarım yaparken bir view veya viewdan türemiş bir componente (UILabel, UIButton vb.) tıkladığımızda storyboard attributes inspector içinde cornerRadius özelliğini göreceğiz.  Bir proje içinde çok fazla kullanılabilecek bir özellik olan cornerRadius özelliğini UIView extension ile artık çok rahat bir şekilde ayarlayabilmekteyiz.

Yazdığımız bu extensionlar sayesinde işimiz bir hayli kolaylaşmaktadır. Tek bir defa yazıp sınırsız kullanabiliyor olmamız extensionların ne kadar güçlü ve önemli olduğunu bize göstermektedir.

Özet

Bu dersimizde Swift Extensions konusunu inceledik. Extensionlar sayesinde projeler daha anlaşılır hale getirilebilir. Bir defa yazıp her yerde kullanabileceğimiz için kod tasarrufu yapmış oluruz. Yukarıda bazı temel örnekleri verdik bunları artırmak ve çeşitlendirmek geliştiricinin ihtiyaçlarına göre değişir. Projelerimiz ne kadar büyürse büyüsün extensionlar vasıtasıyla birbiriyle alakalı metotları bir arada tutarak classlarımızı anlamlı parçalara da bölmüş oluruz. Çalışma şekli değişmeyecek ve daha anlaşılır hale gelecektir. Herkes için faydalı olmasını umarak yazımı burada tamamlıyorum. Sorunuz olduğunda yorum kısmında veya soru-cevap kısmında sorabilirsiniz. Mutluluklar dilerim, sağlıcakla kalınız…

Kaynak: https://docs.swift.org/swift-book/LanguageGuide/Extensions.html

5

Ali Hasanoglu

Yorum Yaz

Haftalık Bülten

Mobilhanem'de yayınlanan dersleri haftalık mail almak ister misiniz?