Sobes.tech
Middle

Swift dilində unowned nədir və necə istifadə olunur?

sobes.tech Süni İntellekt

AI-dan cavab

Swift-də unowned referans (zəif dolayı mülkiyyət) iki obyekt bir-birinə güclü istinad etdikdə, onların yaddaşdan azad edilməsini əngəlləmək üçün istifadə olunur.

unowned-in xüsusiyyətləri:

  • unowned istinad etdiyi obyektin həmişə mövcud olduğunu təmin edir, bu istinad istifadə edilən zaman.
  • Əgər unowned istinada olan obyektə giriş cəhd etsəniz və obyekt artıq azad edilibsə, iş vaxtı xətası (runtime crash) baş verəcək.
  • Bu, istinad edən obyektin ömür dövrü onun istinad etdiyi obyektin daha qısa olmadıqda istifadə olunur. Yəni, unowned istinad obyektə güc vermir.

İstifadə nümunəsi bağlamada:

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

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

    deinit {
        print("\(name) azad edilir")
    }
}

class CreditCard {
    let number: UInt64
    unowned let customer: Customer // Customer-ə unowned istinad

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

    deinit {
        print("Kredit kartı #\(number) azad edilir")
    }
}

var john: Customer? // Azad etməyə imkan vermək üçün opsional Customer
john = Customer(name: "John Appleseed")
john!.card = CreditCard(number: 1234_5678_9012_3456, customer: john!)

// `nil` təyin etmək, Customer və Card-in azad edilməsinə səbəb olacaq,
// çünki güclü istinad döngüsü yoxdur
john = nil 

Başqa nümunə - bağlamada unowned istifadə:

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

    lazy var asHTML: () -> String = { [unowned self] in // unowned self istifadə olunur
        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) azad edilir")
    }
}

var paragraph: HTMLElement? // Opsional HTML elementi
paragraph = HTMLElement(name: "p", text: "salam dünya")
print(paragraph!.asHTML())

// `nil` təyin etmək, HTMLElement-i azad edəcək, çünki bağlam onu güclü tutmur
paragraph = nil

unownedweak arasında seçim, referansın nil olub-olmamasına bağlıdır. Əgər referans heç vaxt nil ola bilməzsə, unowned istifadə edin. Əks halda, weak istifadə edin.