2

Apple による Swift Programming Book のコード例を次に示します (章: Deinitializers)

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

class MyPlayer {
    var coinsInPurse: Int
    init(coins: Int){
        coinsInPurse = Bank.vendCoins(coins)
    }
    func winCoins(coins: Int){
        coinsInPurse += Bank.vendCoins(coins)
    }
    deinit {
        Bank.receiveCoins(coinsInPurse)
        println("Bank has \(Bank.coinsInBank) coins")
    }
}

var playerOne: MyPlayer? = MyPlayer(coins: 250)
playerOne?.winCoins(100)
println("PlayerOne has \(playerOne!.coinsInPurse) coins")
println("Bank has \(Bank.coinsInBank) coins")
playerOne = nil
println("Bank has \(Bank.coinsInBank) coins")  //This prints 9650
                                               //instead of 10000

deinit メソッドが呼び出されていないようです。なんで?

4

1 に答える 1

1

Xcode 6.1 (おそらく 6.2 もインストールしていません) プレイグラウンドでこれを試している場合、プレイグラウンドでは気付かなかった余分な保持が行われることがあるため、この動作が見られます。このコードを 6.1.1 のスクラッチ Swift コンソール アプリケーションに貼り付けると、正しく動作し、10000 が出力されます。

最新の Xcode ベータ版 (6.3) では、このコードはプレイグラウンドでも期待どおりに機能します。

于 2015-03-24T14:28:24.000 に答える