//*****************Deinitialization 反初始化***************
// 关键字 denit
// 在实类对象被销毁的时候, 会立刻调用 denit
// 每个类对象都有 deinitializer 方法
// denitializer 不需要传入任何参数
// denitializer 在对象销毁前,自动被调用,不需要自己手动调用
// 子类的denitializer 继承于 父类的 denitializer
// 子类的 denitializer 调用时 父类的 denitializer 会自动调用
// 无论子类是否实现 denitializer, 在对象销毁前 都会调用父类的 denitializer
// denitializer 调用时 对象还没有销毁, 可以获取所有的属性,并对属性进行处理
class Bank{
// 银行存款
static var coinsInBank = 10_000
// 取出
static func distribute(coins numberOfCoinsRequested: Int) -> Int{
let numberOfCoinsToVend = min(numberOfCoinsRequested,coinsInBank)
coinsInBank -= numberOfCoinsToVend
return numberOfCoinsToVend
}
//存入
static func receive(coins: Int){
coinsInBank += coins
}
}
class Player{
// 玩家钱包
var coinsInPurse: Int
// 初始化 coins: 银行取出的金币
init(coins: Int){
coinsInPurse = Bank.distribute(coins: coins)
}
//赢得的金币 装入钱包
func win(coins:Int){
coinsInPurse += Bank.distribute(coins: coins)
}
// 反初始化
deinit {
// 银行收回 金币
Bank.receive(coins: coinsInPurse)
}
}
var playerone: Player? = Player(coins: 100)
print("a new player has joined the game with \(playerone!.coinsInPurse) coins")
//a new player has joined the game with 100 coins
print("There are now \(Bank.coinsInBank) coins left in the bank")
//There are now 9900 coins left in the bank
playerone!.win(coins: 2_000)
print("PlayerOne won 2000 coins & now has \(playerone!.coinsInPurse) coins)")
playerone = nil
print("PlayerOne has left the game")
print("The bank now has \(Bank.coinsInBank) coins")
//The bank now has 10000 coins