Initsializatorlar


ULASHISH

Swift initsializatorlari

Obyektni sozlashni designated, convenience va memberwise initsializatorlar yordamida yarating va moslashtiring.


Memberwise va maxsus init

Struct’lar standart holatda memberwise (a’zolar bo‘yicha) initsializatorga ega bo‘ladi.

Shuningdek, o‘zingizning maxsus initsializatorlaringizni ham e’lon qilishingiz mumkin.

Sintaksis: init(params) { self.prop = ... }

Misol

struct User { var name: String; var age: Int }
let a = User(name: "Morgan", age: 30) // memberwise

struct Point {
  var x: Int, y: Int
  init(_ x: Int, _ y: Int) { self.x = x; self.y = y }
}
let p = Point(1, 2)

O‘zingiz sinab ko‘ring »

Ushbu misolda oddiy struct uchun memberwise initsializator va pozitsion parametrli maxsus initsializator ko‘rsatilgan.


Sinfdagi designated va convenience initsializatorlar

Sinflar saqlanadigan xususiyatlarni to‘liq initsializatsiya qilish uchun designated (asosiy) initsializatorlardan, qisqa yo‘llarni taqdim etish uchun esa convenience (yordamchi) initsializatorlardan foydalanadi.

Sintaksis:

  • init(...) (designated)
  • convenience init(...) (self.init ni chaqirishi shart)

Misol

class Person {
  let name: String
  let age: Int
  init(name: String, age: Int) {
    self.name = name; self.age = age
  }
  convenience init(name: String) { self.init(name: name, age: 0) }
}

let p1 = Person(name: "Robin", age: 30)
let p2 = Person(name: "Elisabeth")

O‘zingiz sinab ko‘ring »

Convenience initsializator designated initsializatorga murojaat qilish (delegation) orqali age uchun standart qiymatni taqdim etadi.



Failable va throwing init

Noto‘g‘ri kiritilgan ma’lumotda nil qaytarish uchun failable initsializatorlardan, xatolar haqida signal berish uchun esa throwing initsializatorlardan foydalaning.

Sintaksis:

  • init?
  • init throws

Misol

struct Email {
  let value: String
  init?(_ s: String) { if s.contains("@") { value = s } else { return nil } }
}

enum InitError: Error { case invalid }
struct Port {
  let number: Int
  init(_ n: Int) throws { guard (1...65535).contains(n) else { throw InitError.invalid }; number = n }
}

O‘zingiz sinab ko‘ring »

Ushbu misolda email uchun failable initsializator va port oralig‘ini tekshirish uchun throwing initsializator ko‘rsatilgan.

Maslahat: Oddiy qiymat tiplari uchun memberwise initsializatorlarni afzal ko‘ring; tekshiruvni (validation) maxsus initsializatorlarga qo‘shing.



W3Schools Pathfinder

Yutuqlaringizni kuzating – bu bepul!