可選協(xié)議含有可選成員,其遵循者可以選擇是否實(shí)現(xiàn)這些成員。在協(xié)議中使用@optional關(guān)鍵字作為前綴來(lái)定義可選成員。
可選協(xié)議在調(diào)用時(shí)使用可選鏈,詳細(xì)內(nèi)容在可選鏈章節(jié)中查看。
像someOptionalMethod?(someArgument)一樣,你可以在可選方法名稱(chēng)后加上?來(lái)檢查該方法是否被實(shí)現(xiàn)。可選方法和可選屬性都會(huì)返回一個(gè)可選值(optional value),當(dāng)其不可訪問(wèn)時(shí),?之后語(yǔ)句不會(huì)執(zhí)行,并返回nil。
注意: 可選協(xié)議只能在含有@objc前綴的協(xié)議中生效。且@objc的協(xié)議只能被類(lèi)遵循。
Counter類(lèi)使用CounterDataSource類(lèi)型的外部數(shù)據(jù)源來(lái)提供增量值(increment amount),如下所示:
@objc protocol CounterDataSource {
@optional func incrementForCount(count: Int) -> Int
@optional var fixedIncrement: Int { get }
}
CounterDataSource含有incrementForCount的可選方法和fiexdIncrement的可選屬性。
注意:CounterDataSource中的屬性和方法都是可選的,因此可以在類(lèi)中聲明但不實(shí)現(xiàn)這些成員,盡管技術(shù)上允許這樣做,不過(guò)最好不要這樣寫(xiě)。
Counter類(lèi)含有CounterDataSource?類(lèi)型的可選屬性dataSource,如下所示:
@objc class Counter {
var count = 0
var dataSource: CounterDataSource?
func increment() {
if let amount = dataSource?.incrementForCount?(count) {
count += amount
} else if let amount = dataSource?.fixedIncrement? {
count += amount
}
}
}
count屬性用于存儲(chǔ)當(dāng)前的值,increment方法用來(lái)為count賦值。
increment方法通過(guò)可選鏈,嘗試從兩種可選成員中獲取count。
dataSource可能為nil,因此在dataSource后邊加上了?標(biāo)記來(lái)表明只在dataSource非空時(shí)才去調(diào)用incrementForCount`方法。dataSource存在,但是也無(wú)法保證其是否實(shí)現(xiàn)了incrementForCount方法,因此在incrementForCount方法后邊也加有?標(biāo)記。
在調(diào)用incrementForCount方法后,Int型可選值通過(guò)可選綁定(optional binding)自動(dòng)拆包并賦值給常量amount。
當(dāng)incrementForCount不能被調(diào)用時(shí),嘗試使用上一篇:Swift注釋下一篇:Swift數(shù)值運(yùn)算