Swift | İleri Düzey Fonksiyonlar

cemal tüysüz
4 min readDec 4, 2022

--

Herkese selamlar, bu yazıda swift ile geliştirme yapan her geliştiricinin bilmesi gereken map, compactMap veya flatMap gibi ileri düzey fonksiyonlara değiniyor ve bir kaç ileri düzey fonksiyonu da bizler yazıyor olacağız. Hazırsanız başlayalım.

Bu yazıda yoğun bir biçimde closure kullanacağız. Eğer closure konusuna hakim değilseniz closure ile ilgili yazıma bu link üzerinden ulaşabilirsiniz.

Map

Bir liste içerisinde yer alan tüm elementler ile işlemler yapmanızı ve işlenmiş elementler ile yeni bir liste oluşturmanızı sağlar.

Aşağıdaki örnek kod bloğunu inceleyelim :

Satır 1 de yer alan isim listesinin her bir elemanında yer alan ismin karakterleri büyütülmek isteniyor. Bu yuzden foreach ile her bir isim geziliyor ve swap işlemi uygulanıyor.

Bu durumu map ile gerçekleştirelim.

Map Fonksiyonunun yardımıyla yeni bir liste bile oluşturmaya gerek kalmadan işimizi daha temiz bir şekilde halletmiş olduk.

Şimdi de kendimize ait özelleştirilmiş bir map fonksiyonu yazalım.

Burada oluşturuyor olduğumuz map fonksiyonu swift ile birebir aynı değil. Örneğin bu map ile bütün bir listenin elemanlarını type casting yapamazsınız. Sadece örnek olması açısından oluşturdum. Gerçek map yöntemini bu link üzerinden inceleyebilirsiniz.

Array extension kapsamında myMap adında bir fonksiyon oluşturdum. Geliştirici bu fonksiyonu kullanmak istediğinde, o anki listenin içerisinde foreach ile geziyor olacağız. Her bir elemanı parametre olarak girilen closure a göndereceğiz. Geliştirici eleman ile işlemlerini tamamladıktan sonra işlenmiş elemanı bize geri return edecek. Bizde yeni oluşturduğumuz listenin içerisine ekleyeceğiz. Tüm elemanları gezdikten sonra yeni oluşturduğumuz listeyi return ediyor olacağız.

CompactMap

Map ile aynı görevi görür. Aradaki fark ise CompactMap non-optional değerleri döndürür.

Elimizde bir liste var ve bu listenin convert edilebilir tüm elamanlarını Int e çevirmek istiyoruz. Bu bağlamda aşağıdaki kodu inceleyelim :

Bu işlemi map ile yaptığımızda sonuçların nullable ve bazılarının ise nil geldiğini gördük. Bunun yerine compactMap kullansaydık alacağımız netice aşağıdaki gibi olacaktı :

FlatMap

Alt listelerin elemanlarını bir üst listeye çıkararak tek bir liste altında toplamak için flatMap kullanılabilir.

Filter

Bir array içerisinde filtreleme yapmanızı sağlar.

Aşağıdaki kod bloğunu inceleyelim :

1 den 10 a kadar bulunan sayıları 2 ye kalansız bölünmeleri koşulu ile satır 3 de filtreliyorum. Filter yöntemi bana bu koşula uyan elementleri yeni bir liste sunuyor.

Bu yapıyı kendimiz yazalım :

Array için myFilter adında bir extension function oluşturdum. Geliştirici bu yöntemi kullanmak istediğinde, o anki dizi içerisinde bir loop ile geziyor olacağız. Dizinin her bir elemanını closure ile geliştiriciye göndereceğiz. Geliştirici o anki elementin koşula uyup olmadığını bir boolean değer ile bize return ediyor olacak. Closure aracılığı ile geri dönen boolean değeri 7ç satırda kontrol ederek o anki eleman sonuç listesine eklenecek ve en son döngünün bittiği noktada sonuç listesi geliştiriciye döndürülecek.

Reduce

Bu yöntem bize bir closure aracılığı ile tüm elemanları tek tek iletir. Her bir elemanı iletirken bunun yanında o anki sonucu iletir. Biz sonuç ve o an gönderilen eleman ile dilediğimiz işlemi yapar ve sonucu return ederiz. Return edilen değer bir sonraki eleman gelirken onun yanında gelecek sonuçtur. Bu açıklama kafanızı karıştırmış olabilir sorun değil :) Örnekler ile daha iyi anlaşılacaktır.

Aşağıdaki kodu inceleyelim :

reduce yöntemini kullanırken önce başlangıç değeri satır 3 de 0 olarak verdik. Sonrasında verilen closure yapısını trailing olarak açtık. Fonksiyon o an ki sonucu ve elemanı iletti bizde bu ikisini toplayıp return ettik. Bu şekilde devam ederek en son bu sayıların toplamını bulduk.

Daha farklı bir örneği inceleyelim :

Kelimeler listesine satır 3 de reduce yöntemini uyguluyorum. Sonuç değerimi başlangıç olarak boş atadım. Sonrasında her bir kelimeyi sonuç değeri ile birleştiriyorum.

RemoveAll

Bir liste içerisinde belirttiğimiz koşula uyan tüm elemanlarının silinmesini sağlar.

Aşağıdaki örneği inceleyelim :

1 den 10 a kadar olan sayıların bulunduğu numbers isimli listeye removeAll yöntemini uyguluyoruz. Bu yöntem ile 2 ye bölünebilen sayıların tamamını listeden kaldırıyoruz.

Bu yöntemi kendimiz yazalım :

Bir foreach ile tüm elemanları tek tek geliştiriciye iletiyoruz. Geliştirici işlemlerini yapıp bize elemanın silinmesi veya silinmemesi gerektiğini bir boolean ile aktarıyor. 7. satırda geliştiricinin return ettiği boolean değeri kontrol ediyoruz ve true ise o değeri siliyoruz. Silme işlemi gerçekleştiğinde index sayısını da bir düşürüyoruz çünkü artık listenin eleman sayısı 1 azalmıştır ve eksiltmezsek listenin boyutu aşar ve hata alırız.

Contains

Herhangi bir array in bizim istediğimiz koşulda bir eleman barındırıp barındırmadığını kontrol eder ve bize boolean bir değer döndürür.

Aşağıdaki kodu inceleyelim:

Sorted

Sorted yöntemi ona sunduğumuz koşul neticesinde listede sıralama işlemi gerçekleştirir. Koşul sunmamız için bize closure içerisinde iki adet parametre gönderir. Bunlar ilk başta birinci ve ikinci elemandır. Bir sonrakinde de ikinci ve üçüncü olmak üzere sürekli artmaktadır. Verilen koşula uymayan iki değer yer değiştirir.

Aşağıdaki kodu inceleyelim :

Burada sağ taraftaki sayıların soldakilerden büyük olmaları gerektiğini belirttik. ( birinci eleman (sol) < ikinci eleman (sağ))

Split

Bu yöntemi ile beraber belirlediğiniz bir ayracın var olduğu her nokta ile yöntemin uygulandığı String nesnesi parçalara ayrılır.

Aşağıdaki kodu inceleyelim:

Satır 1 de bir adet cümle tanımlandı. Satır 3 de bu cümle verilen ayraç ile parçalara ayrıldı.

Joined

Son advanced fonksiyonumuz olan joined split fonksiyonuna çok benzer lakin parçalamak yerine birleştirme amacı ile kullanılır. Split fonksiyonu bir String e uygulandıktan sonra çıktı olarak bir liste veriyordu. Joined fonksiyonu ise bir listeye uygulandığında her 2 eleman arasına verilen ayracı ekleyerek birleştirme işlemi uygular.

Aşağıdaki örneği inceleyelim :

Umarım faydalı bir yazı olmuştur. Bir başka yazıda görüşmek üzere sağlıcakla kalın.

https://giphy.com

--

--