swift(15)析构

析构函数的格式:

deinit {
    // perform the deinitialization
}

析构函数被自动调用,不可被主动调用

析构函数只有一个,没有参数,没有返回值,没有括号

父类析构函数被子类自动继承,父类的析构函数在子类析构函数的最后被自动调用

下面是一个析构函数的例子,为了说明析构函数能做的事情,例子说的是银行和玩家的游戏,银行的钱总数是一个定数,玩家建立时从银行取出一个初始值,然后再玩的过程中挣银行的钱,玩家结束游戏后,要归还自己所有的钱,保证银行的钱总数是一定的。析构函数要做的就是玩家销毁时,将钱归还银行。

struct Bank {
    static var coinsInBank = 10_000
    static func vendCoins(var numberOfCoinsToVend: Int) -> Int {
        numberOfCoinsToVend = min(numberOfCoinsToVend, coinsInBank)
        coinsInBank -= numberOfCoinsToVend
        return numberOfCoinsToVend
    }
    static func receiveCoins(coins: Int) {
        coinsInBank += coins
    }
}

class Player {
    var coinsInPurse: Int
    init(coins: Int) {
        coinsInPurse = Bank.vendCoins(coins)
    }
    func winCoins(coins: Int) {
        coinsInPurse += Bank.vendCoins(coins)
    }
    //玩家的钱全部归还银行
    deinit {
        Bank.receiveCoins(coinsInPurse)
    }
}
//定义为Optional类型,可以赋值为nil,以释放该实体
var playerOne: Player? = Player(coins: 100)
println("A new player has joined the game with \(playerOne!.coinsInPurse) coins")
// prints "A new player has joined the game with 100 coins"
println("There are now \(Bank.coinsInBank) coins left in the bank")
// prints "There are now 9900 coins left in the bank"

playerOne!.winCoins(2_000)
println("PlayerOne won 2000 coins & now has \(playerOne!.coinsInPurse) coins")
// prints "PlayerOne won 2000 coins & now has 2100 coins"
println("The bank now only has \(Bank.coinsInBank) coins left")
// prints "The bank now only has 7900 coins left"

//赋值为nil后,玩家被析构,析构函数被调用,银行的钱变为总数10000
playerOne = nil
println("PlayerOne has left the game")
// prints "PlayerOne has left the game"
println("The bank now has \(Bank.coinsInBank) coins")
// prints "The bank now has 10000 coins"


你可能感兴趣的:(swift,deinit,析构)