Swift — Closures Part-2

Yakup Çağlan
Sep 5, 2018 · 3 min read

Merhabalar 👋 Closure Part -2 ile kaldığımız yerden devam ederek, Capturing Value, Trailing, Escaping ve Autoclosures konularına göz atacağız. Hadi başlayalım. 👊

Capturing Value

Capturing işlemi dıştaki bloğa ait değişkenlerin veya dıştaki fonksiyonun parametrelerinin kullanılmasına olanak sağlayan bir derleyici optimizasyon işlemidir.

Örnekte görüldüğü üzere closure if koşullarına göre kendi bloğu dışındaki iki değeri yakalayıp işlem yapabildi. Sık sık kullandığımız bir örnekle daha açıklayalım.

UIView.animete’e ait closure kendi bloğu dışında ki text değişkinini ve animasyon fonksiyonundan gelen parametreyi yakalayabildi -capturing.

Trailing Closure Syntax

Swift’in okunurluğu artırmak adına sunduğu bu syntax özelliği, bir fonksiyonun son parametresi bir closure ise aşağıda ki şekilde kulanmamıza olanak sağlıyor. Bu özelliği Yukarda ki animation örneğinde de görebiliriz.

Autoclosures

Closure’ı küme parantezleri olmadan çağırmaya yarayan, yazma kolaylığı sağlayan ve okunurluğu artıran bir özelliktir. Tanımı baz alarak örnekle açıklayalım.

Yukarıdaki örnekte 6 üründen oluşan bir alışveriş listemiz var. alisverisYap fonksiyonuna parametre olarak listedeki ilk ürünü listeden çıkaran bir closure yazdık. Şimdi “alindi” isimli closur’ın parametre tipini @autoclosure yapalım. Fonksiyonu tekrar çağırdığımızda sanki string parametresi almış gibi çağırabildiğimizi görebiliriz.

Escaping Closures

İlk önce ismiyle başlayalım. Escaping -kaçan Closure manidar bir isim aslında. Bu closure neyden kaçıyor. 🤓 Closureları tanımlayıp fonksiyona parametre olarak geçtiğimizde derleyici bu Closureları performans nedeniyle varsayılan olarak nonescaping olarak tanımlar. Fonksiyon içersinde o an kullanılır, saklanmaz ve fonksiyon bitiminde yok edilirler, nonescaping - kaçamazlar.

Eğer closure daha sonra kullanılacaksa veya kullanılabilecekse, fonksiyon dışında bir değişkende tutulmalı, parametre tibinide @escaping olarak belirtmeliyiz. Aksi taktirde derleyici hatası alırız.

Yukarıda ki örnek, fonksiyonun bitiminde yok edilen, nonescaping - kaçamayan closure örneğidir. Şimdi @escaping örneğini inceleyelim.

Yukarıdaki örnek birebir apple dökümanlarından alınmıştır.

Örnekte comletionHandlers adında bir closure array tanımlanıyor. Aşağıda ki fonksiyona parametre olarak verilen closure’ın tipi @escaping olarak veriliyor ve fonksiyon içersinde arraye ekleniyor. Dikkat! Closure tipini @escaping olarak belirtmezsek derleyici hatası alınacaktır. Devam edelim.

Adım adım gidelim.

  • SameClass adında bir sınıf tanımlayarak, x değişkenini oluşturduk.
  • doSomething adında bir fonksiyon içersinde escaping ve nonescaping olan iki fonksiyonu çağırdık ve x değişkenine sırayla 100–200 değerlerini verdik.
  • instance adında SomeClass sınıfından bir nesne oluşturduk ve fonksiyonumuzu çağırdık. Gördük ki ilk aşamada 200 değeri döndü. Neden ?

Çünkü nonescape olarak tanımlanan closure fonksiyon gövdesinde çalıştırıldı ve yok edildi. Tipini escaping olarak belirtiğimiz closure hala bellekte saklanıyor.

  • ikinci aşamada completionHandlers.first?() diyerek Closure arrayi içersinde sakladığımız escaping closure’ı çağırıyoruz ve dönen değer 100 oluyor.

Closure Part- 2 ile geri kalan konuları inceledik. Bir sonraki Swift konusunda görüşmek üzere 👋



Let’s join to WHOKNOWS!

We are a publication that creates posts about iOS development, If you liked it and wants to join us, let’s fill the form! tinyurl.com/jointowhoknows


WHOKNOWS

We produces contents about iOS / Swift development.

Yakup Çağlan

Written by

Bilgisayar Mühendisi

WHOKNOWS

WHOKNOWS

We produces contents about iOS / Swift development.