- Parametrli və qiymət qaytaran funksiyalar yazmaq və çağırmaq
- Arqument nişanlarından,
_işarəsindən və susmaya görə qiymətlərdən istifadə etmək - Qapanmalar yazmaq, onları qısaltmaq və sondakı qapanma sintaksisini tanımaq
Təsəvvür et ki, tətbiqində bilet qiymətini on müxtəlif yerdə hesablayırsan. Qaydalar dəyişəndə on yeri düzəltməli olacaqsan və birini mütləq unudacaqsan. Həll yolu funksiyadır: kodu bir dəfə yazır, ona ad verir və lazım olan yerdə çağırırsan. Artıq print, sorted(), map kimi hazır funksiyalardan istifadə etmisən — indi özününkünü yazacaqsan.
Funksiya elan etmək
Funksiya func açar sözü ilə başlayır. Mötərizədə parametrlər tipləri ilə birlikdə yazılır, -> işarəsindən sonra isə qaytarılan qiymətin tipi gəlir. return nəticəni geri qaytarır. Funksiyanın gövdəsi tək ifadədən ibarətdirsə, return sözünü yazmamaq da olar.
func greet(name: String) -> String {
return "Hello, \(name)!"
}
func square(_ x: Int) -> Int {
x * x
}
print(greet(name: "Aysel"))
print(square(7))
print(square(square(2)))Hello, Aysel! 49 16
Arqument nişanları və susmaya görə qiymətlər
Swift-də çağırış cümlə kimi oxunsun deyə hər parametrin iki adı ola bilər: arqument nişanı (çağıranda yazılır) və parametr adı (funksiyanın içində işlədilir). travel(from start: String, to end: String) funksiyası travel(from: "Baku", to: "Shaki") kimi çağırılır. Nişan lazım deyilsə, onun yerinə _ yazılır — square(7) məhz belədir.
Parametrə susmaya görə qiymət vermək olar: çağıranda onu buraxsan, həmin qiymət götürülür. Aşağıda bilet qiyməti 12 yaşdan kiçiklər üçün 5, tələbələr üçün 7,5, qalanlar üçün 10 manatdır.
func travel(from start: String, to end: String) {
print("Travelling from \(start) to \(end)")
}
func ticketPrice(for age: Int, isStudent: Bool = false) -> Double {
if age < 12 {
return 5.0
} else if isStudent {
return 7.5
}
return 10.0
}
travel(from: "Baku", to: "Shaki")
print(ticketPrice(for: 8))
print(ticketPrice(for: 20))
print(ticketPrice(for: 20, isStudent: true))Travelling from Baku to Shaki 5.0 10.0 7.5
Qapanmalar
Adı olmayan, dəyişənə yazıla və başqa funksiyaya ötürülə bilən kod bloku. Fiqurlu mötərizədə yazılır: əvvəlcə parametrlər və qaytarılan tip, sonra in sözü, ardınca gövdə gəlir.
Swift qapanmaları addım-addım qısaltmağa imkan verir: tipləri kontekstdən çıxarır, tək ifadədə return tələb etmir, parametrlərə isə $0, $1 adları ilə müraciət etməyə icazə verir. Aşağıda eyni sıralama dörd dəfə, getdikcə daha qısa yazılıb:
let double = { (x: Int) -> Int in
return x * 2
}
print(double(5))
let numbers = [5, 2, 9, 1]
print(numbers.sorted(by: { (a: Int, b: Int) -> Bool in
return a > b
}))
print(numbers.sorted(by: { a, b in a > b }))
print(numbers.sorted { $0 > $1 })
print(numbers.sorted(by: >))10 [9, 5, 2, 1] [9, 5, 2, 1] [9, 5, 2, 1] [9, 5, 2, 1]
Sondakı qapanmalar
Qapanma funksiyanın sonuncu arqumentidirsə, onu mötərizədən sonra yazmaq olar — buna sondakı qapanma (trailing closure) deyilir. numbers.sorted { $0 > $1 } və prices.map { $0 * 2 } məhz belə yazılıb. Qapanma qəbul edən öz funksiyanı da yarada bilərsən; onun parametrinin tipi () -> Void kimi funksiya tipidir.
func repeatTask(times: Int, task: () -> Void) {
for _ in 1...times {
task()
}
}
repeatTask(times: 3) {
print("Hip hip hooray!")
}
func apply(_ value: Int, _ operation: (Int) -> Int) -> Int {
operation(value)
}
func triple(_ x: Int) -> Int {
x * 3
}
print(apply(4) { $0 + 10 })
print(apply(4, triple))Hip hip hooray! Hip hip hooray! Hip hip hooray! 14 12
Qapanmalar yarandıqları yerdəki dəyişənləri yadda saxlayır (ingiliscə capture). Aşağıdakı makeCounter hər çağırışda bir vahid artan sayğac qaytarır: count dəyişəni funksiya bitəndən sonra da qapanmanın içində yaşamağa davam edir.
func makeCounter() -> () -> Int {
var count = 0
return {
count += 1
return count
}
}
let counter = makeCounter()
print(counter())
print(counter())
print(counter())1 2 3
Əsas fikirlər
- Funksiya
func ad(parametr: Tip) -> QaytarılanTip { ... }şəklində elan olunur. - Arqument nişanı çağırışda, parametr adı funksiyanın içində işlədilir;
_nişanı ləğv edir. - Susmaya görə qiymətli parametri çağırışda buraxmaq olar.
- Qapanma adsız funksiyadır;
$0,$1onun parametrləridir. - Son arqument olan qapanma mötərizədən sonra yazıla bilər; qapanmalar ətrafdakı dəyişənləri yadda saxlayır.
Özünü yoxla
10 sual. Hər düzgün cavab XP qazandırır.
func travel(from start: String, to end: String) funksiyasının düzgün çağırışı hansıdır?