Swift Protocol ve Delegate Kavramları

Mehdican Büyükplevne
4 min readJan 23, 2023

--

Herkese merhabalar, bu benim ilk medium içeriğim ve Swift öğrenme sürecimde geçirdiğim 1,5 aylık serüvenim de öğrendiklerimi aktarmak için ilk attığım adım.

Bugün Swift Protocol ve Delegate kavramlarını anlatacağım.Uzatmadan başlayalım.

Swift proglamlama dilinde Protocol ve Delegate kavramları bir nesnenin diğer nesnelerle nasıl iletişim kuracağını belirlemek için kullanılır.

İnternette “What is Protocol” diye arattığımda blueprint ifadesi dikkatimi çekti. Yazılım geliştirme alanında blueprint ifadesi bizim için uyulması gereken kurallar kümesi anlamını taşıyor. Mesela bir sınıfa bir yapı dahil ediyoruz, ama bunu yaparken bazı kurallara dikkat etmemiz gerekiyor. Çünkü bir Superclass tan inherit etmiş oluyoruz.Protokoller de tam olarak böyle bir yapı aslında, böyle bir durumda protokolü çağıran sınıfa o metotları mutlaka kullanması gerektiğini belirtiyor.

Metotları kullanmak zorundayız!

Protokol hakkında araştırma yaparken, protokol ismini anlatan bir örnek çıkmıştı karşıma; “Bir kurum düşünelim onun yetkilendirdiği bir protokol var ve bu, delegeler üstündeki kurumu temsil ediyor. Gittiği yerlerde onun yerine yani kurum yerine aksiyon alıyor.” Özetlersek;

  • Protokol ; Yapılacaklar kümesi
  • Delegate ; Listedeki görev veya görevlerden sorumlu kişi

Protokoller ne işe yarar?

Protokoller, sınıflar, yapılar veya enumerasyonlar tarafından uygulanabilecek belirli bir davranış veya özellikler kümesini tanımlar. Bu sınıfların özelliklerini veya metodlarını zorunlu hale getirmek için kullanılabilir veya farklı sınıfların aynı davranışları sergilemesini sağlamak için kullanılabilir. Bu, kodun daha okunaklı ve anlaşılır hale gelmesini ve tekrar kullanılabilirliğini arttırmasını sağlar.

Protokol kullanımına örnek olarak; ViewController lar arasında iki yönlü iletişim kurmamızı sağlarlar.Bildiğimiz gibi ileri yönlü veri göndermek istediğimiz zaman prepareForSegue yapısını kullanıyoruz.Veriyi 2. sahne yaratılırken yolluyoruz.

Peki ya 2. sahneden 1. sahneye veri göndermek istersek? O zaman prepareForSegue kavramı işimize pek yaramıyor.Kullanabiliriz ama kullanmak mantıklı olmuyor. Çünkü kullandığımızda her 1. sahneye geçerken o sahnenin bir kopyası oluşturuluyor, bu da bizim kesinlikle istemediğimiz bir durum.

Bizim amacımız ilk ViewController ın orjinaline veri göndermek! Dolayısıyla bunu protocol ve delegate kullanarak yapmamız gerekiyor.

Örnek bir proje oluşturalım; 1. ViewController’ımızda bir adet gönderdiğimiz veriyi göstereceğimiz “label” bir tane de 2. ViewControlller’a gitmemiz için “button” ekleyelim.

2. ViewController’ımıza da bir adet “textField” ve veriyi göndermemiz için tetikleyeceğimiz bir adet “button” ekleyelim

Yeni bir “CocoaTouchClass” ımızı oluşturup 2. sayfamıza da tanımladık.

Birinci ViewController dan ikinci ViewController’a segue tanımlamak için bir “Identifier” tanımlıyoruz.

Daha sonrasında objelerimizi de kod tarafına tanımladıktan sonra,kodlama bölümümüze geçebiliriz →

Öncelikle “button” ile 2. Ekrana geçerken 1. ve 2. ViewController‘daki iletişimi kimin sağlayacağını belirtmemiz gerekiyor.

prepareForSegue metodunu kullanarak “delege” nin, “self” yani 1.ViewController olduğunu belirtmemiz gerekiyor.

Şimdi gelelim protokolümüzü tanımlamaya ; Bunun için 2. ViewController’a gidiyoruz çünkü delegeleri bu sınıf içerisinde görevlendireceğiz.

Bu protokolün içerisine yazdığımız “func transferText(forSenderText: String)” delege metodunu, bu protokolü çağıran sınıfın implement etmesi gerekiyor. (Biraz daha aşağıda görsel ile birlikte bu konudan bahsedeceğiz)

Şimdi bu protokolü kullanmak için bir değişkene atayalım.

Şimdi 2.ViewController dan ayrılmadan son yapmamız gereken bir şey daha var. Veriyi göndermek için tanımladığımız butonun içine aşağıdaki kodumuzu tanımlıyoruz. Değişkenimizi yazıp .(nokta) ya bastığımızda metodumuza ulaşıp metodumuzun içine göndereceğimiz veriyi yazacağımız “textField” ımızı belirtiyoruz. Ki oraya ne yazarsak yazalım onu 1. ViewControllerda bulunan “label” ın içerisine görebilelim.

Daha sonrasında da “navigationController.popViewController” yazıp butona tıkladığımızda bizi direk 1.View Controller’a yönlendirmesi için butonun içine tanımlıyoruz. Ama tabiki daha işimiz bitmedi.

Şimdi gelelim 1.ViewController’ımıza, ben burada daha anlaşılır ve kodun temiz gözükmesi için “extension” yapısını kullandım.

ViewController sınıfımız içerisine oluşturduğumuz protokolümüzü tanımlıyoruz.

Şimdi XCode bizi içerisindeki metodları kullanamaya zorlayacak, hemen “fix” diyip otomatik olarak metodumuzu extension bloğumuzun içerisine implement ediyoruz.

Daha sonrasında 1.ViewController da bulunan “textLabel” ımızı metodumuz içerisinde bulunan “forSenderText” parametresine eşitliyoruz.Yani “forSenderText” parametresi içerisinde bulunan veriyi “textLabel” ımıza atamış oluyoruz.

İşlemimiz bitti. Şimdi ne yapmışız onu görelim;

İkinci ViewController’ımızdan birinci ViewController’ımıza başarıyla verimizi göndermiş olduk.

Elimden geldiğince Protocol ve Delegate kavramlarını örneklerle anlatmaya çalıştım umarım yararlı olmuştur.

Bol kodlu günleriniz olsun :)

--

--