Swift - Kapanışlar
Swift 4'teki kapanışlar, bloklar halinde düzenlenen ve C ve Objective C dilleri gibi herhangi bir yerde çağrılan kendi kendine yeten işlevlere benzer. Fonksiyonların içinde tanımlanan sabitler ve değişken referanslar yakalanır ve kapanışlarda saklanır. İşlevler, özel kapatma durumları olarak kabul edilir ve aşağıdaki üç biçimi alır:
Global İşlevler | İç İçe İşlevler | Kapanış İfadeleri |
---|---|---|
Bir adınız olsun. Herhangi bir değeri yakalamayın | Bir adınız olsun. Çevreleyen işlevden değerleri yakalayın | Adsız Kapanışlar, bitişik bloklardan değerleri yakalar |
Swift 4 dilinde kapanış ifadeleri, net, optimizasyon ve dahil olmak üzere hafif sözdizimi stillerini takip eder.
- Bağlamdan parametre ve dönüş değeri türlerinin çıkarılması.
- Tek ifadeli kapanışlardan örtük dönüşler.
- Steno bağımsız değişken adları ve
- Sondaki kapatma sözdizimi
Sözdizimi
Aşağıda, parametreleri kabul eden ve bir veri türü döndüren kapanışı tanımlamak için genel bir sözdizimi verilmiştir -
{
(parameters) −> return type in
statements
}
Aşağıdaki basit bir örnektir -
let studname = { print("Welcome to Swift Closures") }
studname()
Yukarıdaki programı oyun alanını kullanarak çalıştırdığımızda, aşağıdaki sonucu elde ederiz -
Welcome to Swift Closures
Aşağıdaki kapanış iki parametreyi kabul eder ve bir Bool değeri döndürür -
{
(Int, Int) −> Bool in
Statement1
Statement 2
---
Statement n
}
Aşağıdaki basit bir örnektir -
let divide = {
(val1: Int, val2: Int) -> Int in
return val1 / val2
}
let result = divide(200, 20)
print (result)
Yukarıdaki programı oyun alanını kullanarak çalıştırdığımızda, aşağıdaki sonucu elde ederiz -
10
Kapanışlarda İfadeler
İç içe geçmiş işlevler, kod bloklarını adlandırmak ve tanımlamak için uygun bir yol sağlar. Tüm işlev bildirimini temsil etmek yerine daha kısa işlevleri belirtmek için ad yapıları kullanılır. Fonksiyonun net ve net bir ifadede odaklanmış sözdizimi ile temsil edilmesi, kapanış ifadeleri ile sağlanır.
Artan Sipariş Programı
Bir dizeyi sıralamak, standart kitaplıkta zaten mevcut olan Swift 4s anahtarının ayrılmış işlevi "sıralı" ile gerçekleştirilir. İşlev, verilen dizeleri artan sırada sıralayacak ve eski dizide belirtilen aynı boyut ve veri türüne sahip yeni bir dizideki öğeleri döndürür. Eski dizi aynı kalır.
Sıralanan işlevin içinde iki bağımsız değişken gösterilir -
Diziler olarak temsil edilen Bilinen türdeki değerler.
Dizi içerikleri (Int, Int) ve bir Boolean değeri (Bool) döndürür, eğer dizi düzgün sıralanırsa, doğru değeri döndürür, aksi takdirde false döndürür.
Aşağıda gösterilen dizeleri yeni diziye sıralamak için girdi dizesi olan normal bir işlev yazılır ve sıralanan işleve iletilir -
func ascend(s1: String, s2: String) -> Bool {
return s1 > s2
}
let stringcmp = ascend(s1: "Swift 4", s2: "great")
print (stringcmp)
Oyun alanını kullanarak yukarıdaki programı çalıştırdığımızda, aşağıdaki sonucu alıyoruz -
true
Dondurma için sıralanacak ilk dizi "Swift 4" ve "harika" olarak verilir. Diziyi sıralama işlevi, dize veri türü olarak bildirilir ve dönüş türü Boolean olarak belirtilir. Her iki dizge de karşılaştırılır ve artan sırada sıralanır ve yeni bir dizide saklanır. Sıralama başarılı olursa, işlev gerçek bir değer döndürür, aksi takdirde yanlış döndürür.
Kapanış ifadesi sözdiziminin kullanımları -
- sabit parametreler,
- değişken parametreler ve
- inout parametreleri.
Kapanış ifadesi varsayılan değerleri desteklemiyordu. Değişken parametreler ve Tuples, parametre türleri ve dönüş türleri olarak da kullanılabilir.
let sum = {
(no1: Int, no2: Int) -> Int in
return no1 + no2
}
let digits = sum(10, 20)
print(digits)
Yukarıdaki programı oyun alanını kullanarak çalıştırdığımızda, aşağıdaki sonucu elde ederiz -
30
İşlev deyiminde belirtilen parametreler ve dönüş türü bildirimleri, aynı zamanda satır içi kapanış ifade işlevi ile 'in' anahtar sözcüğüyle temsil edilebilir. Bir kez parametre ve dönüş türlerini bildirdikten sonra 'in' anahtar sözcüğü kapanışın gövdesini belirtmek için kullanılır.
Tek İfade Örtülü İadeler
Burada, sıralanan işlevin ikinci bağımsız değişkeninin işlev türü, kapanış tarafından bir Bool değerinin döndürülmesi gerektiğini açıklığa kavuşturur. Kapanış gövdesi, bir Bool değeri döndüren tek bir ifade (s1> s2) içerdiğinden, belirsizlik yoktur ve return anahtar sözcüğü atlanabilir.
İfade kapanışlarında Tek bir ifade ifadesi döndürmek için 'return' anahtar sözcüğü bildirim bölümünde atlanır.
var count:[Int] = [5, 10, -6, 75, 20]
let descending = count.sorted(by: { n1, n2 in n1 > n2 })
let ascending = count.sorted(by: { n1, n2 in n1 < n2 })
print(descending)
print(ascending)
Yukarıdaki programı oyun alanını kullanarak çalıştırdığımızda, aşağıdaki sonucu elde ederiz -
[75, 20, 10, 5, -6]
[-6, 5, 10, 20, 75]
İfadenin kendisi, string1'in string 2'den büyük olduğu zaman true değerini döndürdüğünü, aksi halde false değerini döndürdüğünü açıkça tanımlar, bu nedenle return ifadesi burada atlanır.
Bilinen Tip Kapamalar
İki sayının toplamasını düşünün. Eklemenin tamsayı veri türünü döndüreceğini biliyoruz. Bu nedenle, bilinen tür kapanışları şu şekilde bildirilir -
let sub = {
(no1: Int, no2: Int) -> Int in
return no1 - no2
}
let digits = sub(10, 20)
print(digits)
Yukarıdaki programı oyun alanını kullanarak çalıştırdığımızda, aşağıdaki sonucu elde ederiz -
-10
Steno Bağımsız Değişken Adlarını Kapanış Olarak Bildirme
Swift 4, kapanış argümanlarının değerlerine $ 0, $ 1, $ 2, vb. Adlarıyla atıfta bulunmak için kullanılabilen satır içi kapanışlara otomatik olarak kısa argüman adları sağlar.
var shorthand: (String, String) -> String
shorthand = { $1 }
print(shorthand("100", "200"))
Burada $ 0 ve $ 1, kapanışın birinci ve ikinci String argümanlarına atıfta bulunur.
Yukarıdaki programı oyun alanını kullanarak çalıştırdığımızda, aşağıdaki sonucu elde ederiz -
200
Swift 4, kullanıcının $ 0, $ 1, $ 2 --- $ n'yi temsil ederek Satır içi kapanışları kısa argüman adları olarak göstermesini kolaylaştırır.
Kestirme argüman adlarını kapanış ifadeleri içinde temsil ettiğimizde, tanım bölümünde kapanış argüman listesi atlanır. İşlev türüne bağlı olarak, steno bağımsız değişken adları türetilecektir. Steno argüman ifade gövdesinde tanımlandığından 'in' anahtar kelimesi atlanır.
Operatör İşlevleri Olarak Kapanışlar
Swift 4, yalnızca operatör işlevlerini kapatma işlevi sağlayarak üyelere erişmenin kolay bir yolunu sağlar. Önceki örneklerde 'Bool' anahtar kelimesi, dizeler eşit olduğunda 'true' ya dönmek için kullanılır, aksi takdirde 'false' döndürür.
İfade, kapanışta operatör işlevi tarafından daha da basitleştirilmiştir -
let numb = [98, -20, -30, 42, 18, 35]
var sortedNumbers = numb.sorted ({
(left: Int, right: Int) -> Bool in
return left < right
})
let asc = numb.sorted(<)
print(asc)
Yukarıdaki programı oyun alanını kullanarak çalıştırdığımızda, aşağıdaki sonucu elde ederiz -
[-30, -20, 18, 35, 42, 98]
Fragman Olarak Kapanışlar
Fonksiyonun son argümanının bir kapanış ifadesine geçirilmesi, 'İzleyen Kapamalar' yardımıyla bildirilir. {} İle fonksiyonun () dışında yazılır. Fonksiyonu satır içi olarak tek bir satıra yazmak mümkün olmadığında kullanılması gerekir.
reversed = sorted(names) { $0 > $1}
burada {$ 0> $ 1}, dışında (adlar) bildirilen sondaki kapanışlar olarak temsil edilir.
import Foundation
var letters = ["North", "East", "West", "South"]
let twoletters = letters.map({
(state: String) -> String in
return state.substringToIndex(advance(state.startIndex, 2)).uppercaseString
})
let stletters = letters.map() {
$0.substringToIndex(advance($0.startIndex, 2)).uppercaseString
}
print(stletters)
Yukarıdaki programı oyun alanını kullanarak çalıştırdığımızda, aşağıdaki sonucu elde ederiz -
[NO, EA, WE, SO]
Değerleri ve Referans Türlerini Yakalama
Swift 4'te sabitlerin ve değişkenlerin değerlerinin yakalanması kapanışlar yardımıyla yapılır. Ayrıca, değişkenler artık mevcut olmasa bile, kapanış gövdesi içindeki bu sabitler ve değişkenler için değerleri belirtir ve değiştirir.
Sabit ve değişken değerlerin yakalanması, diğer işlevin gövdesine işlev yazarak yuvalanmış işlev kullanılarak elde edilir.
İç içe geçmiş bir işlev yakalar -
- Dış fonksiyon argümanları.
- Outer işlevi içinde tanımlanan sabitleri ve değişkenleri yakalayın.
Swift 4'te, bir fonksiyonun içinde bir sabit veya bir değişken bildirildiğinde, bu değişkenlere referans da kapanış tarafından otomatik olarak oluşturulur. Ayrıca tesise aşağıdaki gibi ikiden fazla değişkeni aynı kapanışla gönderme olanağı sağlar -
let decrem = calcDecrement(forDecrement: 18)
decrem()
Buraya oneDecrement ve Azaltma değişkenlerinin her ikisi de kapanış referansı olarak aynı bellek bloğunu gösterecektir.
func calcDecrement(forDecrement total: Int) -> () -> Int {
var overallDecrement = 100
func decrementer() -> Int {
overallDecrement -= total
print(overallDecrement)
return overallDecrement
}
return decrementer
}
let decrem = calcDecrement(forDecrement: 18)
decrem()
decrem()
decrem()
Yukarıdaki programı oyun alanını kullanarak çalıştırdığımızda, aşağıdaki sonucu elde ederiz -
82
64
46
CalcDecrement dış işlevi her çağrıldığında, decmenter () işlevini çağırır ve değeri 18 birim azaltır ve sonucu dış işlev olan calcDecrement yardımıyla döndürür. Burada calcDecrement bir kapatma görevi görür.
Decrementer () işlevi herhangi bir argüman kapamasına sahip olmasa da, varsayılan olarak 'genelDecrement' ve 'toplam' değişkenlerini mevcut değerlerini yakalayarak ifade eder. Belirtilen değişkenler için değerlerin kopyası, yeni düşürücü () işlevi ile saklanır. Swift 4, değişkenler kullanımda değilken bellek alanlarını ayırarak ve serbest bırakarak bellek yönetimi işlevlerini yönetir.