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:
unownedreferans qilayotgan ob'ekt doimo mavjud bo'lishini kafolatlaydi, referansdan foydalanish vaqtida.- Agar
unownedreferansga 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,
unownedreferans 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.