標籤:
代碼-情形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類執行個體與循環參考的解決