Swift學習筆記十四

2022-07-14 17:30:14 字數 2236 閱讀 4239

deinitialization

當類的例項物件即將要被釋放時,會立即呼叫deinitializer,通過deinit關鍵字來定義deinitializer,和initializer一樣,它也只存在於類型別上。

當例項物件不再有用時,swift會自動釋放該物件。swift通過自動引用計數(arc)來管理例項記憶體。通常情況下,物件被釋放時,你並不需要做特別的清理,但是,如果你操作了你自己的資源,可能需要做一些額外的清理工作。比如,你在某個類中開啟了乙個檔案,並往裡寫入了資料,那麼你需要在這個類的例項物件釋放前關閉檔案。

乙個類最多只能有乙個deinitializer,並且它不接受任何引數,定義方式也是無引數形式:

deinit

deinitializer是自動在合適的時刻被呼叫的,你不能手動呼叫它。

超類的deinitializer會自動被子類繼承,並且超類的deinitializer會自動在子類的deinitializer實現完成之後被呼叫。當然,如果子類並沒有提供deinitializer的實現,超類的deinitializer依然會被自動呼叫。因為例項物件是在deinitializer被呼叫完成之後才會被釋放,因此deinitializer可以訪問例項物件的所有屬性,並且基於這些屬性實現一些操作(比如查詢需要被關閉的檔案名字)。

struct

bank

static

func receivecoins(coins: int)

}

這裡定義了乙個結構體來模擬乙個簡單的遊戲虛擬銀行,它負責整個遊戲裡的貨幣儲存和借貸,它宣告了乙個型別屬性coinsinbank來跟蹤銀行裡面的現金數。這裡vendcoins方法定義了乙個變數型引數,這樣它就不用在方法體內部再宣告乙個變數然後賦值,而是直接操作這個變數型引數就可以了。

class

player

func wincoins(coins: int)

deinit

}

player模擬遊戲中的玩家,它宣告乙個儲存屬性coinsinpurse來標識這個例項物件當前擁有的金幣數。在init和wincoins兩個方法中,雖然接受了乙個coins引數,但是並不是直接將其賦值給儲存屬性,而是取決於bank能夠借貸出來的金幣數。這裡定義了乙個deinitializer,在當前例項物件被釋放之前將所擁有的金幣歸還給銀行。

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」

這裡定義了乙個可選player型別變數playerone,之所以定義為可選型別,是因為該玩家可以隨時離開遊戲,即該物件隨時可能被釋放。這裡要訪問它的儲存屬性時,用了隱式展開可選項符號(!),同樣,在呼叫它的例項方法時也要這樣:

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」

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」

Swift2 2 學習筆記 十四

sort 函式 sort swift 標準庫 供了 sort 函式,會根據您 供的排序閉包將已知型別陣列中的值進行排序。let names chris alex ewa barry daniella func backwards s1 string,s2 string bool var revers...

Swift學習筆記(三十四) 函式型別

1 函式也可以賦值給乙個變數,此時這個變數的型別是什麼呢?import foundation func add a int,b int int let anotheradd int,int int add anotheradd 3,4 2 如果引數的返回值為空,那麼這個函式型別應該怎麼寫呢?impo...

swift學習筆記

1 值永遠不會被隱式轉換為其他型別。如果你需要把乙個值轉換成其他型別,請顯式轉換。let label the width is let width 94 let widthlabel label string width could not find an overload for that acc...