私有訪問(wèn)修飾符限制它所定義的實(shí)體以及實(shí)體中的任何類(lèi)型的訪問(wèn)——也稱(chēng)為“詞匯范圍”。同一源文件中類(lèi)型的擴(kuò)展也可以訪問(wèn)實(shí)體的。
為了證明這一點(diǎn),可以通過(guò)擴(kuò)展BasicAccount創(chuàng)建一個(gè)CheckingAccount(支票賬戶)。
class CheckingAccount: BasicAccount {
private let accountNumber = UUID().uuidString
class Check {
let account: String
var amount: Dollars
//兌現(xiàn)
private(set) var cashed = false
func cash() {
cashed = true
}
init(amount: Dollars, from account: CheckingAccount) {
self.amount = amount
self.account = account.accountNumber
}
}
}
CheckingAccount有一個(gè)聲明為private的accountNumber。CheckingAccount還有一個(gè)嵌套類(lèi)Check,可以在其初始化方法中讀取私有值accountNumber。
注意:在本例中,UUID類(lèi)用于生成唯一的帳戶號(hào)。這個(gè)類(lèi)是Foundation的一部分,所以不要忘記導(dǎo)入它!
CheckingAccount能夠開(kāi)支票和兌換現(xiàn)金。在CheckingAccount中添加以下方法:
func writeCheck(amount: Dollars) -> Check? {
guard balance > amount else {
return nil
}
let check = Check(amount: amount, from: self)
withdraw(amount: check.amount)
return check
}
func deposit(_ check: Check) {
guard !check.cashed else {
return
}
deposit(amount: check.amount)
check.cash()
}
雖然CheckingAccount仍然可以進(jìn)行基本的存款和取款,但是它現(xiàn)在的 writeCheck(amount:) 在提取金額和創(chuàng)建支票之前需要檢查是否有足夠的余額,并且如果支票已經(jīng)兌現(xiàn),那么deposit(_:)方法將不會(huì)存款。
讓約翰給簡(jiǎn)寫(xiě)張支票,在你的playground上試一試這個(gè)代碼。
// 創(chuàng)建一個(gè)John的支票賬戶存入 $300.00
let johnChecking = CheckingAccount()
johnChecking.deposit(amount: 300.00)
// 開(kāi)一個(gè) $200.00的支票
let check = johnChecking.writeCheck(amount: 200.0)!
// 創(chuàng)建一個(gè)Jane的支票賬戶, 把 john的支票存進(jìn)去
let janeChecking = CheckingAccount()
janeChecking.deposit(check)
janeChecking.balance // 200.00
// 再次把支票存入,沒(méi)有影響。
// Jane's balance this time :]
janeChecking.deposit(check)
janeChecking.balance // 200.00
使用點(diǎn)語(yǔ)法查看哪些是CheckingAccount的接口。

accountNumber被視為CheckingAccount的實(shí)現(xiàn)細(xì)節(jié),對(duì)于使用代碼是不可見(jiàn)的。
同時(shí),Check使cashed私有了,所以使用cash()方法代替

這個(gè)接口提供了一種方法,可以將支票標(biāo)記為已經(jīng)兌換,但不能反過(guò)來(lái)。換句話說(shuō),不可能取消兌現(xiàn)支票。
最后,盡管在CheckingAccount無(wú)法看到accountNumber,但是任何持有支票的人都可以訪問(wèn)這個(gè)號(hào)碼:

重要的是,不管這個(gè)代碼是如何實(shí)現(xiàn)的,訪問(wèn)修飾符讓代碼形成自己的接口。