Higher Order Functions in Swift

Bengi Anıl
4 min readNov 13, 2023

--

Merhabalar, bu yazımda Swift dilinde yaygın kullanılan ve işimize yarayan hazır fonksiyonlardan bahsedeceğim. Bunlar nelerdir ve nasıl kullanılır, haydi birlikte inceleyelim.

Higher Order Functions Nedir?

Swift dilindeki Higher Order Functions (Yüksek Düzey Fonksiyonlar), kodumuzun daha okunabilir, sürdürülebilir ve etkili olmasını sağlamak için güçlü bir araç seti sunan fonksiyonlardır. Bunlar çoğunlukla array’ler üzerine uygulanır.

Bu yazıda sırasıyla forEach(), sort(), sorted, reduce(), filter(), map(), compactMap() ve flatMap() olmak üzere her bir fonksiyona örnek ile değineceğiz.

Higher Order Functions
  1. forEach()
  • Eğer bir array üzerinde döngü yapmak ve her eleman için belirli bir işlemi uygulamak istiyorsak, forEach fonksiyonunu kullanabiliriz. İşte basit bir örnek:
let numbers = [1, 2, 3, 4, 5]

numbers.forEach { number in
print(number*2)
}
// Output:
// 2
// 4
// 6
// 8
// 10

Burada numbers array’inin her bir elemanının iki katını forEach() fonksiyonu ile dolanarak tek bir satır kod ile elde edebildik, hem okunaklı hem de efektif bir kod yazmış olduk.

2. sort() ve sorted()

  • sort(): Bu fonksiyon, array’i doğrudan değiştirir ve sıralı hale getirir. Orijinal dizi üzerinde değişiklik yaparak sıralama işlemini gerçekleştirir.
  • sorted(): Bu fonksiyon, orijinal array’i değiştirmez. Sıralı bir kopya oluşturur ve bu kopyayı geri döner. Orijinal array’e dokunmaz.
var numbers = [4, 7, -2, -9, 3]

numbers.sort()
print(numbers)
// Output: [-9, -2, 3, 4, 7]

let sortedNumbers = numbers.sorted()
print(sortedNumbers)
// Output: [-9, -2, 3, 4, 7]

sort() ile sorted() fonksiyonu arasıdaki en büyük fark sort()’un array’i değiştirmesi diğerinin ise array’i değiştirmemesidir. Sonuç olarak ikisi de işlev olarak aynıdır, sıralama işlemi yapar.

3. reduce()

  • reduce() fonksiyonu, bir array’in tüm elemanlarını birleştirmek, bir değeri hesaplamak veya dönüştürmek için kullanılmaktadır. Bir başlangıç değeri (initial) ve bir closure fonksiyonu alır. Closure fonksiyonu, dizinin her elemanını birleştirmek veya dönüştürmek için kullanılır.
let numbers = [4, 7, -2, -9, 3]

let sum = numbers.reduce(0) { (result, number) in
return result + number
}
print(sum)
// Output: 3

let counts = numbers.reduce(into: [:]) { counts, number in
counts[number, default: 0] += 1
}

Kodda verilen 0 değeri yapılacak işlemin initial değerini temsil etmektedir. Array’in elemanlarının toplamı bu değer üzerine eklenir ve nihai toplam bulunur.

4. filter()

  • filter() fonksiyonu, bir array’in içinde belirli bir koşulu sağlayan elemanları seçmek için kullanılır. Bu fonksiyon, bir closure fonksiyonu alır ve bu closure, her eleman için koşulu değerlendirir. Koşulu sağlayan elemanlar yeni bir array içinde toplanır ve bu yeni array döndürülür.
let numbers = [4, 7, -2, -9, 3]

let positiveNumbers = numbers.filter { number in
number > 0
}
print(positiveNumbers)
// Output: [3, 4, 7]

Eğer numbers array’inin içindeki elemanlardan sadece pozitif sayılardan oluşan bir array elde etmek istersek filtreleme yapmamız gerekir. Koşulumuz sayının sıfırdan büyük olması gerektiğidir. filter() fonksiyonu ise numbers array’i üzerine uygulanır. Elde ettiğimiz yeni positiveNumbers array’i ise amacımıza uygun olarak numbers içindeki sadece pozitif sayıları dönen bir array olmuştur.

filter() fonksiyonu Swift dilinde oldukça kullanışlıdır, kodumuz içerisinde aradığımızı kolayca bulmamıza olanak sağlar.

5. map()

  • map() fonksiyonu, bir array’in her elemanı üzerinde belirli bir dönüşüm veya işlemi uygulamak için kullanılabilir. map() fonksiyonu, array’in her elemanını alır, belirtilen closure fonksiyonunu uygular ve yeni bir array oluşturur.
let numbers = ["1", "two", "3", "four", "5"]
let mappedNumbers = numbers.map { number in
return Int(number)
}
print(mappedNumbers)
// Output: [Optional(1), nil, Optional(3), nil, Optional(5)]

Örnekte görüldüğü üzere, map() her bir String elemanını Int’e dönüştürür. "two" ve "four" gibi geçerli bir sayı olmayan değerler, Int dönüşümü nedeniyle nil olarak gösterilir. Bu nedenle opsiyonel değerleri içeren bir array elde etmiş oluruz.

6. compactMap()

  • compactMap(), map()’in aksine “nil” değerleri hesaba katmayarak sadece “nil” olmayan değerleri içeren bir array oluşturur. Bu sayede, array optional olmaktan çıkmış olur çünkü hiçbir şekilde “nil” değer içermeyecektir.
let mappedNumbers = ["1", "two", "3", "four", "5"]
let compactMappedNumbers = mappedNumbers.compactMap { number in
return Int(number)
}
print(compactMappedNumbers)
// Output: [1, 3, 5]

Bu örnekte "two" ve "four" elemanları geçerli bir Int değerine sahip olmadıkları için sonuç array’ine dahil edilmemiştir.

map() ile compactMap() arasındaki fark compactMap()’in nil olan değerleri dönmemesidir. Kendi içinde bir filtreleme yapmış olur.

7. flatMap()

  • flatMap() özellikle dizinin elemanlarını başka dizilerle birleştirmek veya düzleştirmek için kullanılabilir. Düzleştirme dediğimiz ilem ise, iç içe geçmiş array’in elemanlarını tek bir düz array’de birleştirmeye verilen addır.
let numbers = [[5, 6], [3, 4], [1, 2]]
let allNumbers = numbers.flatMap { numbersArray in
numbersArray
}
print(allNumbers)
// Output: [5, 6, 3, 4, 1, 2]

let allNums = marks.flatMap { $0 }
print(allNums)
// Output: [5, 6, 3, 4, 1, 2]

Örneği incelersek, içi içe array’ler olduğunu görebiliriz. Bu array’leri tek bir array altında toplamak istersek de uygulmamız gereken fonksiton flatMap()’tir.

flatMap() ve compactMap()çoğu zaman aynı sonucu dönebiliyorken bazı durumlarda farklı sonuçlar verebileceğini görebilirsiniz. Bunun sebebi iseflatMap() genellikle dizileri düzleştirmek veya dönüştürmek için kullanılması iken, compactMap() daha spesifik olarak direktnil değerleri temizlemek için kullanılmasıdır.

Sonuç olarak, Higher Order Functions Swift dilinde güçlü araçlardır, kullanmamız hem kendimize hem kodu okuyana hem de projenin hızına katkıda bulunur. Yapacağınız işlemi hızlıca yapabiliyor olursunuz, size de kolaylık sağlar.

Umarım faydalı bir yazı olmuştur😊

Ford Otosan — Connected Products & Engineering Tribe
Mobile Software Development Team Member
Bengi Anıl

--

--