Swift protokollari
Swift protokollari
Tiplar qabul qiladigan xatti-harakat shartnomalarini (contracts) e’lon qiling va standart realizatsiyalar qo‘shish uchun ularni kengaytiring.
Protokollarni e’lon qilish va ularga moslashish
Protokol metodlar va xususiyatlarning loyihasini (blueprint) belgilaydi.
Tiplar protokol uchun realizatsiyalarni taqdim etish orqali uni qabul qiladi.
Sintaksis:
protocol P { var x: Int { get set }; func f() }struct S: P { ... }
Misol
protocol Greetable { func greet() -> String }
struct Person: Greetable {
var name: String
func greet() -> String { "Hello, \(name)" }
}
let p = Person(name: "Swift")
print(p.greet())
Ushbu misolda protokol qanday e’lon qilinishi va tip tomonidan qabul qilinishi hamda tip protokol metodi uchun qanday realizatsiya taqdim etishi ko‘rsatilgan.
Maslahat: Standart metod realizatsiyalarini taqdim etish uchun protokol kengaytmalaridan (extensions) foydalaning.
Protokol kengaytmalari (standart realizatsiyalar)
Protokol kengaytmasiga realizatsiyalar qo‘shish orqali protokolga mos tiplar uchun standart xatti-harakatni taqdim eting.
Misol
protocol Describable { func describe() -> String }
extension Describable {
func describe() -> String { "(no description)" }
}
struct User: Describable { let name: String }
struct Car: Describable {
let model: String
func describe() -> String { "Car: \(model)" }
}
let u = User(name: "Morgan")
let c = Car(model: "SwiftMobile")
print(u.describe())
print(c.describe())
Ushbu misol User ga standart describe() metodini beradi va uni Car da qayta aniqlaydi (override).
Bog‘langan tiplarga (associated types) ega protokollar
Protokolni joy egasi tip bo‘yicha generik qilish uchun associatedtype dan foydalaning.
Protokolga mos tiplar joy egasini aniq (concrete) tipga bog‘laydi.
Misol
protocol Container {
associatedtype Element
mutating func append(_ item: Element)
var count: Int { get }
subscript(i: Int) -> Element { get }
}
struct IntStack: Container {
private var items: [Int] = []
mutating func append(_ item: Int) { items.append(item) }
var count: Int { items.count }
subscript(i: Int) -> Int { items[i] }
}
func allItemsMatch<C1: Container, C2: Container>(_ c1: C1, _ c2: C2) -> Bool
where C1.Element == C2.Element, C1.Element: Equatable {
guard c1.count == c2.count else { return false }
for i in 0..<c1.count { if c1[i] != c2[i] { return false } }
return true
}
Ushbu misol generik Container protokolini e’lon qiladi va ikki konteynerning elementlari bir-biriga mos kelishini tekshiradi.
W3Schools Pathfinder
Yutuqlaringizni kuzating – bu bepul!
