Protocols: Giriş

Bilgisayarlar HTTP protokolü ile iletişim kurabilirler. Bir objeye belirli özellikler ve görevler yükleyen Protocol yapısını inceleyelim.

Ufuk Köşker
TurkishKit
6 min readApr 8, 2019

--

Herkese merhaba! Swift “Protocol Oriented” bir dildir, biz de bu yazımızda Protocol kavramını inceleyeceğiz 😉

Protocol Nedir ?

Tüm yazılım dillerinde inheritance(miras alma) kavramı vardır. Nesne Yönelimli Programlama dillerinin en önemli kavramlarından birisi Inheritance kavramıdır.

Gerçek hayattan örnek verecek olursak, halk dilinde “Ben, annemin göz rengini almışım” deriz ancak tıp dilinde ise “Siz annenizden kalıtımsal olarak göz rengini almışsınız” denir. Nesne Yönelimli Programlama dillerinde de Inheritance kavramının rolü de aynen böyledir.

Protocol’e Neden İhtiyaç Duyarız ?

Swift, Multiple Inheritance destekleyen bir dil değildir. Single Inheritance destekleyen bir dildir. Şimdi bunun ne anlama geldiğini kodlayarak anlayalım.

Boş bir Playground projesi oluşturun ve aşağıdaki kodu yazın.

Birkaç Class ile senaryomuzu oluşturduk.

Ne yaptık ?
Animal ve Human adında iki farklı Class(sınıf) yazdık. Human sınıfını Animal sınıfından türettik. Human sınıfımız artık Animal sınıfındaki özellikleri de taşıyor. Hadi test edelim.

Inheritance yapısının kullanımı.

Burada human1 adında Human sınıfından bir nesne oluşturduk. human1 yazıp noktaya bastığımızda Animals sınıfının içindeki özelliklere de ulaşabiliyoruz. İşte biz burada Inheritance bir yapı kurduk, yani miras aldık.

Swift dilinin Multiple Inheritance desteklemediğini Single Inheritance kullanılabildiğini söylemiştik. Hadi bu yapıyı inceleyeyim.

Multiple Inheritance

Burada Walk ve Breath adında yeni sınıflar yazdık ve Human sınıfımıza Inheritance ettik. Bu işlemi yaptığımız gibi Xcode bize kızmaya başlayacaktır.

Multiple Inheritance

Human hem yürüyebilir hem de nefes alabilir. Peki bu iki özelliği aynı anda nasıl alacağız ? İşte burada Protocol Oriented devereye giriyor.

Protocol Kullanımı

Protocol tanımlamak Class tanımlamak kadar kolay. Protocol tanımlarken fiilerin sonuna -able (bişey yapabilir, bişey yapabilme yetisine sahip) eki getirilir.

Protocol tanımladık.

Eğer Human: Walkable, Speakable yanında Super Class yoksa bu yapının Super Class’ı NSObject olacaktır. Biz kodumuzda Animal sınıfını eklediğimiz için bizim Super Class’ımız Animal oldu ve Animal sınıfından türeyen sınıfa Walkable ve Speakable özelliklerini ekledik.

Ancak bu durum Swift dilinde çok kullanılmaz. Apple da kullanmamızı istemiyor. Inheritance kullanacaksak Class değil Struct kullanmalıyız. Struct yapılarında Inheritance yapısı yok. Struct yapısında direk protocol kullanabiliyoruz. Ne demek istiyorum anlamaya çalışalım…

Struct ve Protocol
Struct’a super class eklenemez!

Struct yapıları inheritance olmuyor demiştik. İşte kanıtı :)
Apple derki; “Class kullanmayın, Inheritance yapmayın, Struct kullanın bunun yanına protocollerinizi ekleyin”.

Protokollerimizin içini dolduralım.

Soru: Protokollerin içine neler yazabiliriz ?
Cevap:
Fonksiyonlar, Değişkenler ve Initializer yazabiliriz ancak biraz farklı bir yazım sitili vardır.
Protokoller bir class veya struct olmadığı için burada tanımladığımız değişkenlere sahip olmayacaktır. Bunlara sahip olan yapı Class’ın ta kendisidir. Protokolün içine bir değişken tanımladığımız zaman böyle bir değişkenin olacağını söylüyoruz ama bu değişkenin asıl tutulduğu yer bir class’ın içi veya struct’ın içidir.

Hadi Kodlayalım

Apple’ın dediğini yapalım ve Structlar üzerinden gidelim.

1-) Protocol İçinde Değişken Tanımlama

Struct ile Protocol’leri kullandık.
Protocol içinde değişken tanımladık.

milesPerHour adında bir değişken oluşturduk ve bu değişkenin Double türünde olacağını söyledik.
Nedir bu get, set ?
Eğer var milesPerHour: Double { get } şeklinde kodumuzu yazsaydık. Bu değişkenin değeri değiştirilemez sadece okunabilirdi.

Kodumuzu yazdıysak Xcode bize hata verecektir. Aslında bu bir hata değil. Bunu uyarıcı olarak düşünebilirsiniz.

Protocol’ümüzü Struct’ımıza tanımladık.

Çıkan uyarıya tıklayıp Fix butonuna tıkladığınızda protokolün içindeki değişken otomatik olarak struct yapınızın içine eklenecektir.

Bu uyarı kod yazarken hayatınızı kurtarır. Örneğin çok büyük bir proje yapıyorsunuz ve protokolünüzün içine bir değişken daha eklediniz. Projenizi compiler ettiğinizde çalışmayacaktır. Hatayı tek tek tüm satırlarda aramaktansa Xcode size hatanın kaynağını gösterecek ve Fix butonuna bastığınızda sorun düzelecektir.

2-) Protocol İçinde Fonksiyon Kullanımı
Yeni Protocol ve Struct yapılarımızı oluşturalım.

Protocol içinde Fonksiyon kullanımı.

Tek tek inceleyelim.

Protocol içinde Fonksiyon.

Protokolün içindeki fonksiyonun süslü parantezleri koyulmaz. Çünkü protokolün içini tanımlayacak olan yer protokol değildir. Protokolün içindeki fonksiyonlar parametre de alabilir.

Struct yapılarının oluşturulması.

Struct yapılarınızı yazarken eğer protokol kullanıyorsanız içini kendiniz doldurmayın. Oluşturduğunuz Struct’ta protokol adını yazdığınızda Xcode uyarı verecek ve Fix butonuna bastığınızda otomatik eklenecektir. Eğer kendiniz girmeye çalışırsanız hata yapma şansınız olabilir.

flaylables Array’i oluşrturduk.

Burada Flaylable protokolünü confirm eden tüm Struct yapıları bu Array’in içinde yer alabilir.

Hadi Test Edelim.

Protocol kodumuzu çalıştırdık.

Protokollerde Default Value ve Fonksiyon Tanımlama

Örneğin Flylable protokolünün içine başka bir fonksiyon daha tanımladık ve bunu sadece bir Struct’ta kullanmak istiyoruz ama diğerlerinde kullanmak istemiyoruz. İşte bunu yapabilmek için Default Value tanımlama yapmalıyız.

Aslında bu bizim sürekli karşımıza çıkan bir durum. Örneğin TableView Delegate ve DataSource’ü çağırdığımızda karşımıza sadece iki fonksiyon getiriliyor.

Playground’da TableView Protocollerini çağırdık.

Playground projenizde siz de TableView oluşturabilirsiniz. Gördüğünüz gibi TableView oluşturduğumuzda default olarak sadece iki fonksiyon karşımıza geliyor. Hadi gelin diğer fonksiyonlar nerede onlara bakalım.

UITableView kelimesine command+sol tık yapın -> Jump to Definition seçeneğine tıklayın.

TableView class’ının içerğini gördük.

Bu kadar fazla fonksiyonun arasından sadece 2 fonksiyonun nasıl çağırıldığını öğrenmenin vakti geldi :)

Hadi Başlayalım.

Yeni Protocol ve Struct yapılarımızı oluşturalım.

Default Valu ve Fonksiyon tanımladık.

Default Value ve fonksiyon tanımlayabilmek için Extension tanımladık ve protokolümüzün adını verdik. Extension içerisine yazdığımız fonksiyonlar yada değişkenler diğer Struct’larda Default olarak gösterilmez. Yani Struct’a eklemek zorunda değiliz.

Struct yapılarını inceleyelim.

Struct yapılarımızın birinde fonksiyon var ama diğerinde yok. Çünkü driveNow fonksiyonunu Extension içine yazdık. Eğer diğer Struct yapımızda driveNow fonksiyonumuzu kullanmak istersek Struct yapımızın içinde “d” harfine basıp autoComplete üzerinden fonksiyonumuzu seçmemiz yetecek :)

Protocol’de Default Value ve Fonksiyon.

Swift Öğrenin. Uygulama Geliştirin. Sınırların Ötesine Geçin.

Hem kod yazmaya yeni başlayanların hem de profesyonellerin rahatlıkla takip edebilecekleri 40 saatlik videolu eğitim ile Swift programlama dilini derinlemesine keşfedin. Eğitim boyunca karşılaşacağınız problemleri birebir online görüşmelerde çözün.

Böylelikle Protocol konumuzun sonuna geldik. Protocol konusunun Swift dilinin önemli konularından bir tanesi olduğunu hatırlatmak istiyorum. İleri seviye Protocol konularımızla bir dahaki yazımızda görüşmek üzere. 🤗

--

--