Protocols: İleri Seviye

Bir objeye belirli özellikler ve görevler yükleyen Protocol yapısını ve Protokol Tabanlı Programlamayı inceleyelim.

Ufuk Köşker
TurkishKit
4 min readApr 19, 2019

--

Herkese merhaba! Bugün Protocol kavramının ileri seviye kullanımlarını işleyeceğiz. Vakit kaybetmeden başlayalım 😊

Öncelikle şunu belirtmek istiyorum. Swift 4 ile 5 arasında çok fazla bir değişiklik yoktur. Swift 5'de Protocol konusunda bir değişikliğe gidilmemiştir. “Bende Swift 4 yüklü. Protocol konusunda sorun yaşar mıyım ? Swift 5'e yükseltmem gerek mi ?” diye endişeye kapılmayın. 😊 Eğer Swift 5'de yapılan değişiklikleri görmek istiyorsanız aşağıdaki bağlantıya tıklayarak yapılan değişiklikleri siz de gözlemleyebilirsiniz. 🤗

Protocols konusuna dönecek olursak bir önceki yazımızda Protocols konusuna giriş yapmıştık. Protocols konusuna hakim değilseniz ilk başta ‘Protocols Giriş’ konusunu incelemenizi tavsiye ederim. Protocols Giriş yazımıza aşağıdan ulaşabilirsiziniz.

Xcode’unuzu açın ve Playground Projenizi oluşturun. Hazırsanız başlayalım. 😊

Protokolü Belirli Sınıflara Extension Yapmak

Hemen bir protocol oluşturalım.

Elimizde aşağıdaki gibi bir protokolümüz var. Sadece belirlediğimiz sınıfa göre uzantının(Extension) çalışmasını istiyoruz:

Likeable Protocol’ü oluşturduk.
Class’ları ve Extension’larımızı oluşturduk.

Kodlarımızı bu şekilde oluşturduktan sonra çalıştıralım.

Fix butonuna basarak protocol’lerimizi dahil edelim.
Protocol’lerimi dahil ettik.

Fix butonuna tıkladıktan sonra tekrar çıkan uyarılar canınızı sıkmasın. Sadece başlangıç değerlerinin olmadığını söylüyor ve bunları eklemenizi söylüyor. 😅 Tekrar Fix butonuna tıklayarak sorunu çözebilirsiniz. 😊

Initializer sorununu çözdük.

Gördüğünüz gibi her iki Class yapımızda aynı sonuçları aldık. LikeCount komutumuz her iki sınımızda yok. Ancak elle yazarsak Auto Complete kısmında gözükecektir. Tıpkı ‘Protocols Giriş’ yazısında bahsettiğimiz gibi. ‘Table View’ yapısında tüm Fonksiyonlar karşımıza çıkmıyor. Sadece Extension edilmemiş fonksiyonlar karşımıza çıkıyor.

LikeCount değişkenini sadece ama sadece Account sınıfında çağırmak istiyorum. Bunu nasıl yaparız ? 🤔

Kodumuzu bu şekilde düzenliyoruz. Sadece Extension üzerinde değişiklik yaptık.

Extension üzerinde değişiklik yaptık.

Bu değişikliği yaptıktan sonra Playground bize bir uyarı daha verecektir.

LikeCount değişkenimiz eklendi.

Çıkan uyarıyı Fix yaptıktan sonra likeCount değişkenimiz eklendi.
Peki bu nasıl oldu ? 🤔

Biz sadece Comment Super Class’ından confirm edilmiş sınıflar için Extension ettik.
Daha düzgün açıklayacak olursak eğer. Comment sınıfından türemiş objelere Confirm edilirken kullanılacak bir Extension yazdık.

Kod yapımızı detaylı inceleyelim.

Kod yapımızı inceleyelim.

extension likeable where Self: Comment {} -> where Self: Comment Burada hangi Class Comment sınıfından türerse Extension o zaman çalışır.

Görüldüğü gibi Account sınıfı Comment’ten türemediği için Extension çalışmadı ve protokolün içindeki tüm değişkenleri çağırdı.

Guest sınıfı Comment sınıfından türediği için Extension çalıştı ve sadece ownerId değerini aldı. Default olarakta likeCount 100 olarak dönecek.
Hadi bunu biraz daha geliştirelim.

Yeni objelerimizi ve Extension’ımızı yazalım. Kodlarınızı aşağıdaki gibi düzenleyin.

Yeni objelerimizi oluşturduk.

Kodlarımızı düzenledikten sonra çalıştıralım ve ekran çıktımızı inceleyelim.

Kodumuzun ekran çıktısı.

Tek bir değişken üzerinden iki farklı sonuç. Eğer bir sınıf başka bir sınıfı confirm ediyorsa ona ait olan Extension çalışır.

Protokolün Protokolü Confirm Etmesi

Kod yapımızı aşağıdaki gibi oluşturalım.

Protocol’ün Protocol’ü Confirm etmesi.

Protokoller de kendi aralarında inheritance olabiliyor. protocol2'yi Conform eden tüm yapılarda name değişkeni otomatik olarak gelir. Hadi bunu deneyelim. 😊

Class2 yapımızda Protocol2'yi Confirm ettik. Protocol2'nin içinde name değişkenimiz yoktu ama Class2 yapımızın içine name değişkeni geldi. Bunun sebebi Protocol1, Protocol2'yi confirm etmesidir.

Protocols Tabanlı Programlama serimizin ikinci yazısının sonuna geldik. Protokoller ile alakalı bir sonraki yazımızda görüşmek üzere. 🤗 Protocols Advance projemizi aşağıdaki Github linkinden indirip inceleyebilirsiniz.

--

--