Middle
Swift тилинде unowned эмне жана ал кандай колдонулат?
sobes.tech AI
AIден жооп
Жеке шилтеме (слаб косвенное владение) в Swift колдонулат циклдердин алдын алуу үчүн, анда эки объект бири-бирине катуу шилтеме жасашат, бул алардын эсебинен бошотулушун алдын алат.
unowned өзгөчөлүктөрү:
unownedшилтемеси менен көрсөтүлгөн объект эч качан жок болбойт деп кепилдик берет, анын колдонулушуна чейин.- Эгер
unownedшилтемеге кирүүгө аракет кылсаңыз, ал объект бошотулгандан кийин, чечим чыгуу (runtime crash) болот. - Бул ыкма, шилтемелеген объекттин жашоо цикли узунураак эмес экенин билгенде колдонулат. Башкача айтканда,
unownedшилтемеси объектти күчтөндүрбөйт.
Колдонуу мисалы:
class Customer {
let name: String
var card: CreditCard?
init(name: String) {
self.name = name
}
deinit {
print("\(name) бошотулуп жатат")
}
}
class CreditCard {
let number: UInt64
unowned let customer: Customer // `unowned` шилтемеси Customerга
init(number: UInt64, customer: Customer) {
self.number = number
self.customer = customer
}
deinit {
print("Карта #\(number) бошотулуп жатат")
}
}
var john: Customer? // Опционалдуу Customer
john = Customer(name: "John Appleseed")
john!.card = CreditCard(number: 1234_5678_9012_3456, customer: john!)
// Эгер `nil` коюу болсо, Customer жана Card бошотулат,
// анткени циклик күчтүү шилтеме жок
john = nil
Башка мисал - unowned колдонуу жабыкмада:
class HTMLElement {
let name: String
let text: String?
lazy var asHTML: () -> String = { [unowned self] in // `unowned self` колдонуу
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) бошотулуп жатат")
}
}
var paragraph: HTMLElement? // Опционалдуу HTML элемент
paragraph = HTMLElement(name: "p", text: "hello world")
print(paragraph!.asHTML())
// `nil` коюу HTMLElement бошотулат, анткени жабыкма аны күч менен кармабайт
paragraph = nil
unowned жана weak тандап алуу, объекттин өмүр бою nil болушу мүмкүн экенине көз караштуу. Эгер шилтеме эч качан nil болбойт деп ишенсеңиз, unowned колдонуңуз. Эгер болуу мүмкүнчүлүгү болсо, weak пайдаланыңыз.