Məzmuna keç
Educora
Orta18 dəq6 / 14

Funksiyalar və qapanmalar

Kodu funksiyalara böl: arqument nişanları, susmaya görə qiymətlər və qaytarılan qiymət. Sonra qapanmaları, qısa yazılışları və sondakı qapanmaları öyrən.

Özünü yoxla
Bu dərsdə öyrənəcəksən
  • 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.

Swift
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)))
Gözlənilən nəticə
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.

Swift
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))
Gözlənilən nəticə
Travelling from Baku to Shaki
5.0
10.0
7.5

Qapanmalar

Tərif
Qapanma (closure)

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:

Swift
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: >))
Gözlənilən nəticə
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.

Swift
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))
Gözlənilən nəticə
Hip hip hooray!
Hip hip hooray!
Hip hip hooray!
14
12
Funksiyaya həm qapanma, həm də adı olan başqa funksiya ötürmək olar.

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.

Swift
func makeCounter() -> () -> Int {
    var count = 0
    return {
        count += 1
        return count
    }
}

let counter = makeCounter()
print(counter())
print(counter())
print(counter())
Gözlənilən nəticə
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, $1 onun 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.

1 / 10
func travel(from start: String, to end: String) funksiyasının düzgün çağırışı hansıdır?