程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 更多關於編程 >> Swift教程之類的析構詳解

Swift教程之類的析構詳解

編輯:更多關於編程

Swift教程之類的析構詳解。本站提示廣大學習愛好者:(Swift教程之類的析構詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是Swift教程之類的析構詳解正文


在一個類的實例被釋放之前,析構函數會被挪用。用症結字deinit來界說析構函數,相似於初始化函數用init來界說。析構函數只實用於class類型。

1、析構進程道理

Swift 會主動釋放不再須要的實例以釋放資本。如主動援用計數那一章描寫,Swift 經由過程主動援用計數(ARC)處置實例的內存治理。平日當你的實例被釋放時不須要手動地去清算。然則,當應用本身的資本時,你能夠須要停止一些額定的清算。例如,假如創立了一個自界說的類來翻開一個文件,並寫入一些數據,你能夠須要在類實例被釋放之前封閉該文件。

在類的界說中,每一個類最多只能有一個析構函數。析構函數不帶任何參數,在寫法上不帶括號:

deinit {
// 履行析構進程
}

析構函數是在實例釋放產生前一步被主動挪用。不許可自動挪用本身的析構函數。子類繼續了父類的析構函數,而且在子類析構函數完成的最初,父類的析構函數被主動挪用。即便子類沒有供給本身的析構函數,父類的析構函數也老是被挪用。

由於直到實例的析構函數被挪用時,實例才會被釋放,所以析構函數可以拜訪一切要求實例的屬性,而且依據那些屬性可以修正它的行動(好比查找一個須要被封閉的文件的稱號)。

2、析構器操作

這裡是一個析構函數操作的例子。這個例子是一個簡略的游戲,界說了兩種新類型,Bank和Player。Bank構造體治理一個虛擬泉幣的流暢,在這個流暢中Bank永久弗成能具有跨越 10,000 的硬幣。在這個游戲中有且只能有一個Bank存在,是以Bank由帶有靜態屬性和靜態辦法的構造體完成,從而存儲和治理其以後的狀況。

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

Bank依據它的coinsInBank屬性來跟蹤以後它具有的硬幣數目。銀行還供給兩個辦法——vendCoins和receiveCoins——用來處置硬幣的分發和搜集。

vendCoins辦法在 bank 分發硬幣之前檢討能否有足夠的硬幣。假如沒有足夠多的硬幣,Bank前往一個比要求時小的數字(假如沒有硬幣留在 bank 中就前往 0)。vendCoins辦法聲明numberOfCoinsToVend為一個變量參數,如許便可以在辦法體的外部修正數字,而不須要界說一個新的變量。vendCoins辦法前往一個整型值,注解了供給的硬幣的現實數量。

receiveCoins辦法只是將 bank 的硬幣存儲和吸收到的硬幣數量相加,再保留回 bank。

Player類描寫了游戲中的一個玩家。每個 player 在任什麼時候刻都有必定數目的硬幣存儲在他們的錢包中。這經由過程 player 的coinsInPurse屬性來表現:

class Player {
var coinsInPurse: Int
init(coins: Int) {
coinsInPurse = Bank.vendCoins(coins)
}
func winCoins(coins: Int) {
coinsInPurse += Bank.vendCoins(coins)
}
deinit {
Bank.receiveCoins(coinsInPurse)
}
}

每一個Player實例都由一個指定命目硬幣構成的啟動額度初始化,這些硬幣在 bank 初始化的進程中獲得。假如沒有足夠的硬幣可用,Player實例能夠收到比指定命目少的硬幣。

Player類界說了一個winCoins辦法,該辦法從銀行獲得必定數目的硬幣,並把它們添加到玩家的錢包。Player類還完成了一個析構函數,這個析構函數在Player實例釋放前一步被挪用。這裡析構函數只是將玩家的一切硬幣都前往給銀行:

var playerOne: Player? = Player(coins: 100)
println(“A new player has joined the game with (playerOne!.coinsInPurse) coins”)
// 輸入 “A new player has joined the game with 100     coins”
println(“There are now (Bank.coinsInBank) coins left     in the bank”)
// 輸入 “There are now 9900 coins left in the bank”

一個新的Player實例跟著一個 100 個硬幣(假如有)的要求而被創立。這個Player實例存儲在一個名為playerOne的可選Player變量中。這裡應用一個可選變量,是由於玩家可以隨時分開游戲。設置為可選使得你可以跟蹤以後能否有玩家在游戲中。

由於playerOne是可選的,所以由一個感慨號(!)來潤飾,每當其winCoins辦法被挪用時,coinsInPurse屬性被拜訪並打印出它的默許硬幣數量。

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

這裡,player 曾經博得了 2,000 硬幣。player 的錢包如今有 2,100 硬幣,bank 只殘剩 7,900 硬幣。

playerOne = nil
println(“PlayerOne has left the game”)
// 輸入 “PlayerOne has left the game”
println(“The bank now has (Bank.coinsInBank) coins”)
// 輸入 “The bank now has 10000 coins”

玩家如今曾經分開了游戲。這注解是要將可選的playerOne變量設置為nil,意思是“沒有Player實例”。當這類情形產生的時刻,playerOne變量對Player實例的援用被損壞了。沒有其它屬性或許變量援用Player實例,是以為了清空它占用的內存從而釋放它。在這產生前一步,其析構函數被主動挪用,其硬幣被前往到銀行。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved