- 다음은 작동 중인 초기화 해제의 예입니다.
- 이 예제에서는 간단한 게임에 대해 Bank와 Player라는 두 가지 새로운 유형을 정의합니다.
- Bank 클래스는 10,000개 이상의 코인이 유통될 수 없는 구성 통화를 관리합니다.
- 게임에는 Bank가 하나만 있을 수 있으므로 Bank는 현재 상태를 저장하고 관리하기 위한 유형 속성과 메서드가 있는 클래스로 구현됩니다.
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
}
}
- 은행은 CoinInBank 속성을 사용하여 보유하고 있는 현재 코인 수를 추적합니다.
- 또한 코인의 배포 및 수집을 처리하기 위해 distribute(coins:) 및 receive(coins:)의 두 가지 방법을 제공합니다.
- distribution(coins:) 메소드는 분배하기 전에 은행에 충분한 코인이 있는지 확인합니다.
- 코인이 충분하지 않은 경우 Bank는 요청된 수보다 작은 수를 반환합니다(은행에 코인이 남아 있지 않으면 0을 반환).
- 제공된 실제 코인 수를 나타내는 정수 값을 반환합니다.
- receive(coins:) 메소드는 단순히 수신된 코인 수를 은행의 코인 저장소에 다시 추가합니다.
- Player 클래스는 게임의 플레이어를 설명합니다. 각 플레이어는 언제든지 지갑에 일정 수의 동전을 보관하고 있습니다.
- 이것은 플레이어의 coinInPurse 속성으로 표시됩니다.
class Player {
var coinsInPurse: Int
init(coins: Int) {
coinsInPurse = Bank.distribute(coins: coins)
}
func win(coins: Int) {
coinsInPurse += Bank.distribute(coins: coins)
}
deinit {
Bank.receive(coins: coinsInPurse)
}
}
- 각 Player 인스턴스는 초기화 중에 은행에서 지정된 수의 코인의 시작 허용량으로 초기화되지만 사용 가능한 코인이 충분하지 않은 경우 Player 인스턴스는 해당 수보다 적게 받을 수 있습니다.
- Player 클래스는 은행에서 일정 수의 동전을 검색하여 플레이어의 지갑에 추가하는 win(coins:) 메서드를 정의합니다.
- Player 클래스는 또한 Player 인스턴스가 할당 해제되기 직전에 호출되는 초기화 해제를 구현합니다. 여기서 deinitializer는 단순히 플레이어의 모든 코인을 은행에 반환합니다.
var playerOne: Player? = Player(coins: 100)
print("A new player has joined the game with \(playerOne!.coinsInPurse) coins")
print("There are now \(Bank.coinsInBank) coins left in the bank")
- 사용 가능한 경우 100개의 코인을 요청하는 새 Player 인스턴스가 생성됩니다.
- 이 Player 인스턴스는 playerOne이라는 선택적 Player 변수에 저장됩니다.
- 플레이어는 언제든지 게임을 떠날 수 있으므로 선택적 변수가 여기에 사용됩니다.
- 선택 사항을 사용하면 현재 게임에 플레이어가 있는지 여부를 추적할 수 있습니다.
- playerOne은 선택 사항이기 때문에 기본 동전 수를 인쇄하기 위해 coinInPurse 속성에 액세스할 때와 win(coins:) 메서드가 호출될 때마다 느낌표(!)가 표시됩니다.
playerOne!.win(coins: 2_000)
print("PlayerOne won 2000 coins & now has \(playerOne!.coinsInPurse) coins")
print("The bank now only has \(Bank.coinsInBank) coins left")
- 여기에서 플레이어는 2,000코인을 획득했습니다. 플레이어의 지갑에는 이제 2,100개의 동전이 있고 은행에는 7,900개의 동전만 남아 있습니다.
playerOne = nil
print("PlayerOne has left the game")
print("The bank now has \(Bank.coinsInBank) coins")
- 플레이어는 이제 게임을 떠났습니다.
- 이는 선택적 playerOne 변수를 "플레이어 인스턴스 없음"을 의미하는 nil로 설정하여 표시됩니다.
- 이 시점에서 Player 인스턴스에 대한 playerOne 변수의 참조가 깨집니다.
- 다른 속성이나 변수는 여전히 Player 인스턴스를 참조하지 않으므로 메모리를 확보하기 위해 할당이 해제됩니다.
- 이러한 일이 발생하기 직전에 해당 초기화 해제 프로그램이 자동으로 호출되고 해당 코인이 은행으로 반환됩니다.