Sobes.tech
Middle

Swift tilida unowned nima va qanday ishlatiladi?

sobes.tech AI

AIdan javob

Swift'ta unowned referans (zaqpsizsiz bilvosita) ikki ob'ekt bir-biriga kuchli murojaat qilganda, ularning xotiradan chiqarilishini oldini olish uchun ishlatiladi.

unowned ning xususiyatlari:

  • unowned referans qilayotgan ob'ekt doimo mavjud bo'lishini kafolatlaydi, referansdan foydalanish vaqtida.
  • Agar unowned referansga kirishga harakat qilsangiz, ob'ekt chiqarilgan bo'lsa, ishga tushish vaqti xatosi (runtime crash) yuz beradi.
  • Bu, referans qilayotgan ob'ektning hayot aylanishi, referans qilayotgan ob'ektning hayot aylanishidan uzun bo'lmagan hollarda ishlatiladi. Ya'ni, unowned referans ob'ektni kuchli qilmaydi.

Misol uchun, yopilish (closure) ichida foydalanish:

class Customer {
    let name: String
    var card: CreditCard?

    init(name: String) {
        self.name = name
    }

    deinit {
        print("\(name) chiqarilmoqda")
    }
}

class CreditCard {
    let number: UInt64
    unowned let customer: Customer // Customer ga unowned referans

    init(number: UInt64, customer: Customer) {
        self.number = number
        self.customer = customer
    }

    deinit {
        print("Karta #\(number) chiqarilmoqda")
    }
}

var john: Customer? // chiqarishni ta'minlash uchun optional Customer
john = Customer(name: "John Appleseed")
john!.card = CreditCard(number: 1234_5678_9012_3456, customer: john!)

// `nil` ga tayinlash, Customer va Card ni chiqaradi,
// chunki kuchli tutish sikli yo'q
john = nil 

Yana bir misol - yopilish ichida unowned ishlatish:

class HTMLElement {
    let name: String
    let text: String?

    lazy var asHTML: () -> String = { [unowned self] in // unowned self ishlatilmoqda
        if let text = self.text {
            return "<\(self.name)>\(text)</\(self.name)>"
        } else {
            return "<\(self.name) />"
        }
    }

    init(name: String, text: String? = nil) {
        self.name = name
        self.text = text
    }

    deinit {
        print("\(name) chiqarilmoqda")
    }
}

var paragraph: HTMLElement? // Optional HTML element
paragraph = HTMLElement(name: "p", text: "salom dunyo")
print(paragraph!.asHTML())

// `nil` ga tayinlash, HTMLElement ni chiqaradi, chunki yopilish uni kuchli tutmaydi
paragraph = nil

unowned va weak orasidagi tanlov, referans nil bo'lishi mumkinmi yoki yo'qmi, unga bog'liq. Agar referans hech qachon nil bo'lmaydigan bo'lsa, unowned ni tanlang. Agar bo'lishi mumkin bo'lsa, weak ni ishlating.