このページは「相互参照」をもつインスタンスを円満に消去するためのサンプルコードです。

本文の続きを読む

//
//  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.
	}


}


本文の続きを読む