Swift protokollari


ULASHISH

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())

O‘zingiz sinab ko‘ring »

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())

O‘zingiz sinab ko‘ring »

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
}

O‘zingiz sinab ko‘ring »

Ushbu misol generik Container protokolini e’lon qiladi va ikki konteynerning elementlari bir-biriga mos kelishini tekshiradi.



W3Schools Pathfinder

Yutuqlaringizni kuzating – bu bepul!