- Protokol elan etmək, ona uyğun tiplər yaratmaq və genişlənmə ilə yeni metodlar əlavə etmək
throws,throw,tryvədo-catchilə 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
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.
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())
}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.
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!")
}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.
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)")
}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.
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()
}struct ContentView: View— ekran adi strukturdur vəViewprotokoluna uyğundur. Protokol yalnız bir şey tələb edir:bodyxassəsi.var body: some View— ekranda nə göstəriləcəyini qaytaran hesablanan xassə.VStackelementləri şaquli düzür,Textmə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.#PreviewXcode-un kətan (canvas) panelində ekranın canlı önizləməsini göstərir.
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.
- 1Layihə yarat
Xcode-da
File › New › Project…seç,iOSbölməsindəAppşablonunu götür və interfeys kimiSwiftUIseçildiyinə əmin ol. - 2Kodu yaz
ContentView.swiftfaylını aç və yuxarıdakı kodu ora yaz. - 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.
- 4Simulyatorda işə sal
Yuxarıda iPhone modelini seç və
Cmd+Rbas — tətbiq iPhone simulyatorunda açılacaq.
Ə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.
extensionmövcud tiplərə, həttaInt-ə və protokollara yeni metodlar əlavə edir.throwsfunksiyasıthrowilə xəta atır; onutryilə çağırıbdo-catchilə tuturuq.try?xətanınil-ə çevirir,try!isə xəta olanda proqramı çökdürür.- SwiftUI ekranı
Viewprotokoluna uyğun struktur kimi təsvir edir;@Statedəyişəndə ekran avtomatik yenilənir.
Özünü yoxla
10 sual. Hər düzgün cavab XP qazandırır.