Sobes.tech
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 пайдаланыңыз.