Swift Yüksek Mertebeli Fonksiyonlar


Yüksek mertebeli fonksiyonlar, parametreleri fonksiyon olan fonksiyonlardır. 



Map

Bir koleksiyon üzerinde döngü oluşturmak ve koleksiyondaki her öğeye aynı işlemi uygulamak için kullanılabilir.


numbersArray adlı bir dizideki her öğeyi 3 ile çarpmamız gerektiğini varsayalım.

let numbersArray = [1,2,5,8,9,3]

let mappedArray = numbersArray.map {$0 * 3}

map sayesinde dizi içindeki her elemanı($0) gezerek 3 ile çarpılmasını sağlar ve bize dizinin yeni halini geri döndürür. Bu şekilde for döngüsüne ihtiyaç duymayız.
Başka bir örnek ise;

let names = ["Atakan", "Erkan", "Mustafa", "Kerim"]

let namesLowercase = names.map {$0.lowercased()}

Sonuç olarak;
print(namesLowercase)  // ["atakan", "erkan", "mustafa", "kerim"]

CompactMap

CompactMap, Map işleviyle aynıdır ancak isteğe bağlı kullanım özelliğine sahiptir. Dönüşümünüz isteğe bağlı bir değer dizisi almak için bu yöntemi kullanırız.

let possibleNumbers = ["1", "2", "5", "//7//" ,  "merhaba"]

let compactMapped = possibleNumbers.compactMap {Int($0)}
print(compactMapped)  //[1, 2, 5]

Flatmap

Bir dizi içinde farklı diziler varsa bunları tek dizide birleştirir.

let numbers = [[1,2,3],[4,5,6]]

let flatMapped = numbers.flatMap {$0}
print(flatMapped)  //[1,2,3,4,5,6]

NOT: flatMap deprecated olduğundan yerine compactMap kullanılmaktadır

Filter

Filter ile dizide istediğimiz koşula uyan elemanları yeni bir dizide toplamamızı sağlar. 

var numbersArray = [1,2,5,8,9,3]

let filteredArray = numbersArray.filter {$0% 2 == 0}
print(filteredArray)  //[2,8]

Sayısal değerlerde işlemlere göre filtreleyebildiğimiz gibi metinsel değerlerde de koşula uygun olarak filtreleme sağlayabiliriz;

var namesArray = ["Atakan", "Erkan", "Mustafa", "Kerim"]

let namesFiltered = namesArray.filter {$0.first == "A"}
print(namesFiltered) // ["Atakan"]  A harfiyle başlayan ilk bulduğu değeri getirdi.

Reduce

Dizideki değerleri işleme sokup tek bir değer elde etmemizi sağlar. Reduce yöntemi iki değer alır, bir başlangıç ​​değeri (initialResult) ve bir birleştirme kapanışı (nextPartialResult). Nereden başlayacağını söylemek için ilk sonuca ihtiyaç duyulur ve daha sonra yöntem kapanıştaki mantığa dayanarak bu sonuç üzerinde çalışır. Sonuç, herhangi bir türün nihai birleşmiş değeridir.

var numbers = [1,2,3,4,5,6]

let totalNumbers = numbers.reduce(0, {$0 + $1}) // ilk verilen değer işleme alındığından toplamada etkilemesin diye 0 verildi.

let multiplyNumbers = numbers.reduce(1, {$0 * $1})  // ilk verilen değer işleme alındığından çarpmada etkilemesin diye 1 verildi.

print(totalNumbers)  //21
print(multiplyNumbers)  //720

Sort

Sıralama işleminde kullanılır. Default olarak artan sıralama (küçükten büyüğe) sağlar.

var names = ["Mustafa", "Kerim", "Atakan", "Erkan"]

let namesSorted = names.sorted()
print(namesSorted)  // ["Atakan", "Erkan", "Kerim", "Mustafa"]

Sıralama işlemini küçükten büyüğe yapmak için;

let namesSorted = names.sorted(by: >)
print(namesSorted)  // ["Mustafa",  "Kerim, "Erkan", "Atakan"]

Contains

Dizinin verilen değeri karşılayan bir öğe içerip içermediğini gösteren bir Boolean değeri döndürür.

var names = ["Atakan" , "Erkan", "Mustafa", "Kerim"]

let startWithC = names.contains{$0.first == "C"}
print(startWithC)  //False

let startWithA = names.contains{$0.first == "A"}
print(startWithA)  //True 

Drop

Koşul doğru geldiğinde diziden öğeleri at, yanlış döndürdüğünde dur.

var fruits = ["Kiwi","Pineapple","Coconut","papaya","Banana","Rambutan"]

let fruitDrop = fruits.drop { $0.contains("K") }  
//["Pineapple","Coconut","papaya","Banana","Rambutan"]

Chaining

Zincirleme, henüz yeni öğrendiğiniz tüm Yüksek Mertebeden İşlevleri tek bir kod satırında birleştirme yeteneğidir.

var names = ["Stefano", "Brian", "Sean", "Kate", "Luca", "Zoe"]

let namesStartingWithS = names.filter{$0.first == "S"}.map{$0.uppercased()}.sorted()
print(namesStartingWithS)  // ["Sean","Stefano"] 


Closures yapılarını daha iyi kavrayabilmek için Closure Eğitimini buraya tıklayarak inceleyebilirsiniz.