このページは「相互参照」をもつインスタンスを円満に消去するためのサンプルコードです。
// // ViewController.swift // MyApp // // Created by Shimizu Miki on 2014/07/31. // Copyright (c) 2014年 Shimizu Miki. All rights reserved. // import UIKit class Leader{ let name = "ジェフ" var message:String var tour:Tour? init(){ message = "こんにちは、\(name)です!\n" } func planTour(tourName:String){ self.tour = Tour(name:tourName) tour!.leader = self message += "今度、\(tour!.name)に行くよ!\n" } func addBass(bassist:Musician){ tour!.addBass(bassist) message += "\(bassist.name)期待してるぜ!\n" } func addDrums(drummer:Musician){ tour!.addDrums(drummer) message += "\(drummer.name)期待してるぜ!\n" } func delBass(){ tour!.delBass() message += "そいつは残念だ!\n" } func delDrums(){ tour!.delDrums() message += "そいつは残念だ!\n" } func cancelTour(){ if (tour != nil){ tour = nil } } func reportMessage()->String{ return message } } class Tour{ let name:String var leader:Leader? var bass:Musician? var drums:Musician? init(name:String){ self.name = name } func addBass(bassist:Musician){ bass = bassist bass!.tour = self bass!.leader = self.leader bass!.joinTour() } func addDrums(drummer:Musician){ drums = drummer drums!.tour = self drums!.leader = self.leader drums!.joinTour() } func delBass(){ if(bass != nil){ bass!.cancelTour() bass = nil } } func delDrums(){ if(drums != nil){ drums!.cancelTour() drums = nil } } deinit{ if (leader != nil){ leader!.message += "バッドニュースだ。\(name)は中止になっちゃったんだ。この次は必ず行くよ!" } } } class Musician{ let name:String var part:String var leader:Leader? var tour:Tour? init(name:String, part:String){ self.name = name self.part = part } func joinTour(){ if(leader != nil && tour != nil){ leader!.message += "「\(name)です。\(tour!.name)に参加できて嬉しいです。」\n" } } func cancelTour(){ if (leader != nil && tour != nil){ leader!.message += "「\(name)です。\(tour!.name)にいけなくなって残念です。」\n" tour = nil } } } class ViewController: UIViewController { @IBOutlet weak var resultText: UITextView! override func viewDidLoad() { super.viewDidLoad() var myStr = "" let jeff = Leader() jeff.planTour("2014アメリカ横断スーパーツアー") let tony = Musician(name:"トニー", part:"ベース") let bill = Musician(name:"ビル", part:"ドラム") jeff.addBass(tony) jeff.addDrums(bill) jeff.delBass() jeff.delDrums() jeff.cancelTour() myStr += jeff.reportMessage() resultText.text = myStr } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } }