Swift類執行個體與循環參考的解決

來源:互聯網
上載者:User

標籤:

代碼-情形1:

// 兩個屬性的值都允許為nil,這種情境最適合用弱引用來解決class Person {    let name: String    init(name: String) {        self.name = name    }        // 弱引用    var apartment: Apartment?    deinit {        print("\(name) is being deinitialized")    }}class Apartment {    let number: Int        init(number: Int) {        self.number = number    }        // 弱引用    weak var tenant: Person?        deinit {        print("Apartment #\(number) is being deinitialized")    }}var John: Person? = Person(name: "John")var Number73: Apartment? = Apartment(number: 73)John!.apartment = Number73Number73!.tenant = JohnJohn = nilNumber73 = nil

 

代碼-情形2:

// 一個屬性的值允許為nil,而另一個屬性的值不允許為nil,這種情境最適合通過無主引用來解決class Customer {    let name: String    var card: CreditCard?    init(name: String) {        self.name = name    }    deinit {        print("\(name) is being deinitialized")    }}class CreditCard {    let number: UInt64    // 無主引用,不會對執行個體產生強引用    unowned let customer: Customer    init(number: UInt64, customer: Customer) {        self.number = number        self.customer = customer    }    deinit {        print("Card #\(number) is being deinitialized")    }}var john: Customer? = Customer(name: "John Appleseed")john!.card = CreditCard(number: 1234_5678_9012_3456, customer: john!)john = nil

 

代碼-情形3:

// 兩個屬性都必須有值,並且初始化完成後永遠不會為nil// 這種情境最適合通過一個類使用無主屬性,而另外一個類使用隱式解析可選屬性來解決class Country {    let name: String    var capitalCity: City!    init(name: String, capitalName: String) {        self.name = name        self.capitalCity = City(name: capitalName, country: self)    }    deinit {        print("Country named \(name) is being deinitialized")    }}class City {    let name: String    unowned let country: Country    init(name: String, country: Country) {        self.name = name        self.country = country    }    deinit {        print("City named \(name) is being deinitialized")    }}var country: Country? = Country(name: "Canada", capitalName: "Ottawa")country = nil

 

Swift類執行個體與循環參考的解決

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.