Məzmuna keç
Educora
İrəli22 dəq8 / 14

Protokollar, xətalar və SwiftUI

Protokollar və genişlənmələrlə tiplərə ümumi qaydalar və yeni imkanlar ver, `throws` və `do-try-catch` ilə xətaları idarə et, sonra SwiftUI ilə ilk ekranın necə qurulduğunu gör.

Özünü yoxla
Bu dərsdə öyrənəcəksən
  • Protokol elan etmək, ona uyğun tiplər yaratmaq və genişlənmə ilə yeni metodlar əlavə etmək
  • throws, throw, try və do-catch ilə xəta yaratmaq və tutmaq
  • Sadə SwiftUI görünüşünü oxumaq və @State-in rolunu izah etmək

Elektrik rozetkasını düşün: telefon adapteri, çaydan, lampa — hamısı fərqli cihazlardır, amma eyni qaydaya uyğun ştepsellə gəlir və buna görə istənilən rozetkaya qoşulur. Swift-də belə qaydaya protokol deyilir. Bu dərsdə protokolları, xətaların idarə olunmasını öyrənəcək və nəhayət bütün biliklərini birləşdirən SwiftUI ekranı ilə tanış olacaqsan.

Protokollar və genişlənmələr

Tərif
Protokol

Tipin hansı xassə və metodlara malik olmalı olduğunu təsvir edən qaydalar toplusu. Protokolun özündə kod yoxdur; ona uyğun gələn (ingiliscə conform) hər tip bu tələbləri özü yerinə yetirir.

Aşağıda Shape protokolu hər fiqurun adı və sahəsi olmasını tələb edir. Rectangle və Square tamamilə fərqli strukturlardır, amma hər ikisi protokola uyğundur, ona görə onları bir massivdə saxlamaq olar. Protokolun genişlənməsi (extension) isə bütün uyğun tiplərə hazır summary() metodu verir.

Swift
protocol Shape {
    var name: String { get }
    func area() -> Double
}

extension Shape {
    func summary() -> String {
        "\(name): area \(area())"
    }
}

struct Rectangle: Shape {
    let width, height: Double
    var name: String { "Rectangle" }
    func area() -> Double { width * height }
}

struct Square: Shape {
    let side: Double
    var name: String { "Square" }
    func area() -> Double { side * side }
}

let shapes: [any Shape] = [Rectangle(width: 4, height: 2.5), Square(side: 3)]
for shape in shapes {
    print(shape.summary())
}
Gözlənilən nəticə
Rectangle: area 10.0
Square: area 9.0

Genişlənmə ilə mövcud tiplərə, hətta Swift-in öz Int və String tiplərinə də yeni xassə və metodlar əlavə etmək olar. Genişlənmənin içində self həmin qiymətin özüdür.

Swift
extension Int {
    var isEven: Bool {
        self % 2 == 0
    }

    func times(_ action: () -> Void) {
        for _ in 0..<self {
            action()
        }
    }
}

print(7.isEven)
print(10.isEven)
3.times {
    print("Swift!")
}
Gözlənilən nəticə
false
true
Swift!
Swift!
Swift!

Xətaların idarə olunması

Bəzi əməliyyatlar uğursuz ola bilər: hesabda pul çatmır, fayl tapılmır, internet kəsilir. Swift-də belə funksiya throws ilə işarələnir və problem yarananda throw ilə xəta atır. Xəta adətən Error protokoluna uyğun sadalamadır. Xəta atan funksiyanı çağıranda qarşısına try yazılır, xəta isə do-catch blokunda tutulur.

Swift
enum WithdrawError: Error {
    case invalidAmount
    case insufficientFunds(needed: Int)
}

func withdraw(_ amount: Int, from balance: Int) throws -> Int {
    guard amount > 0 else {
        throw WithdrawError.invalidAmount
    }
    guard amount <= balance else {
        throw WithdrawError.insufficientFunds(needed: amount - balance)
    }
    return balance - amount
}

do {
    let left = try withdraw(30, from: 100)
    print("Left: \(left) AZN")
    _ = try withdraw(200, from: left)
    print("This line is skipped")
} catch WithdrawError.insufficientFunds(let needed) {
    print("Not enough money, need \(needed) AZN more")
} catch {
    print("Other error: \(error)")
}
Gözlənilən nəticə
Left: 70 AZN
Not enough money, need 130 AZN more

Proqramın gedişinə diqqət et: birinci çağırış uğurludur və 70 manat qalır. İkinci çağırış xəta atır, ona görə do blokunun qalan hissəsi buraxılır və idarə uyğun catch-ə keçir. Sonuncu catch bütün digər xətaları tutur, onun içində xəta avtomatik olaraq error adlanır.

SwiftUI ilə ilk ekran

SwiftUI Apple-in interfeys qurmaq üçün alətidir. Onda ekranı addım-addım çəkmirsən, sadəcə necə görünməli olduğunu təsvir edirsən — buna deklarativ yanaşma deyilir. Aşağıdakı kod düyməyə hər toxunuşda sayğacı artıran ekrandır. Onu yalnız Xcode-da və ya Swift Playgrounds-da işə salmaq olar, amma artıq hər sətrini başa düşə bilərsən.

Swift
import SwiftUI

struct ContentView: View {
    @State private var count = 0

    var body: some View {
        VStack(spacing: 16) {
            Text("Taps: \(count)")
                .font(.largeTitle)
            Button("Tap me") {
                count += 1
            }
            .buttonStyle(.borderedProminent)
        }
        .padding()
    }
}

#Preview {
    ContentView()
}
Bu kod Xcode-da iPhone ekranı yaradır; konsola heç nə çap etmir.
  • struct ContentView: View — ekran adi strukturdur və View protokoluna uyğundur. Protokol yalnız bir şey tələb edir: body xassəsi.
  • var body: some View — ekranda nə göstəriləcəyini qaytaran hesablanan xassə.
  • VStack elementləri şaquli düzür, Text mətn göstərir, Button-un sondakı qapanması isə toxunuşda icra olunur.
  • .font(...), .padding() kimi modifikatorlar görünüşü dəyişir və nöqtə ilə zəncir şəklində yazılır.
  • #Preview Xcode-un kətan (canvas) panelində ekranın canlı önizləməsini göstərir.
Tərif
@State

Görünüşün yadda saxladığı və dəyişə bilən qiymət. @State qiyməti dəyişəndə SwiftUI body-ni avtomatik yenidən hesablayır və ekranı yeniləyir — Text elementini əl ilə dəyişməyə ehtiyac yoxdur.

  1. 1
    Layihə yarat

    Xcode-da File › New › Project… seç, iOS bölməsində App şablonunu götür və interfeys kimi SwiftUI seçildiyinə əmin ol.

  2. 2
    Kodu yaz

    ContentView.swift faylını aç və yuxarıdakı kodu ora yaz.

  3. 3
    Önizləməyə bax

    Sağdakı kətan panelində ekran dərhal görünəcək; düyməyə toxunub sayğacın artdığını yoxla.

  4. 4
    Simulyatorda işə sal

    Yuxarıda iPhone modelini seç və Cmd+R bas — tətbiq iPhone simulyatorunda açılacaq.

tətbiqi qurub işə salmaqCmd+R
yalnız qurmaq (xətaları yoxlamaq)Cmd+B
kətan (önizləmə) panelini göstərmək və ya gizlətməkCmd+Option+Return
qurulma qovluğunu təmizləməkCmd+Shift+K

Əsas fikirlər

  • Protokol tipin nəyə malik olmalı olduğunu təsvir edir; ona uyğun tiplər tələbləri özləri yerinə yetirir.
  • extension mövcud tiplərə, hətta Int-ə və protokollara yeni metodlar əlavə edir.
  • throws funksiyası throw ilə xəta atır; onu try ilə çağırıb do-catch ilə tuturuq.
  • try? xətanı nil-ə çevirir, try! isə xəta olanda proqramı çökdürür.
  • SwiftUI ekranı View protokoluna uyğun struktur kimi təsvir edir; @State dəyişəndə ekran avtomatik yenilənir.

Özünü yoxla

10 sual. Hər düzgün cavab XP qazandırır.

1 / 10
Tip protokola uyğun gəlmək üçün nə etməlidir?