3 回答

TA貢獻(xiàn)1798條經(jīng)驗(yàn) 獲得超7個(gè)贊
在Swift 4中,現(xiàn)在可以聲明一個(gè)變量,該變量是類型的子類,并且可以同時(shí)實(shí)現(xiàn)一個(gè)或多個(gè)協(xié)議。
var myVariable: MyClass & MyProtocol & MySecondProtocol
或作為方法的參數(shù):
func shakeEm(controls: [UIControl & Shakeable]) {}
蘋果在WWDC 2017 大會(huì)402上宣布了這一點(diǎn):Swift的新增功能
第二,我想談?wù)劷M成類和協(xié)議。因此,在這里,我為UI元素引入了這種可晃動(dòng)的協(xié)議,該協(xié)議可以給人一點(diǎn)震動(dòng)效果,從而引起人們的注意。而且,我繼續(xù)并擴(kuò)展了一些UIKit類,以實(shí)際提供此震動(dòng)功能?,F(xiàn)在,我想寫(xiě)一些看起來(lái)很簡(jiǎn)單的東西。我只想編寫(xiě)一個(gè)函數(shù),該函數(shù)需要一堆可搖晃的控件,并搖晃那些能夠引起人們注意的控件。我可以在此數(shù)組中寫(xiě)什么類型?這實(shí)際上是令人沮喪和棘手的。因此,我可以嘗試使用UI控件。但并非所有UI控件在此游戲中都是可搖晃的。我可以嘗試使用shakable,但并非所有的shakable都是UI控件。實(shí)際上,在Swift 3中沒(méi)有很好的方式來(lái)表示這一點(diǎn)。Swift 4引入了用任何數(shù)量的協(xié)議組成一個(gè)類的概念。

TA貢獻(xiàn)1846條經(jīng)驗(yàn) 獲得超7個(gè)贊
你不能像這樣聲明變量
var object:Base,protocol<ProtocolOne,ProtocolTwo> = ...
也不要像這樣聲明函數(shù)返回類型
func someFunc() -> Base,protocol<MyProtocol,Protocol2> { ... }
您可以像這樣聲明為函數(shù)參數(shù),但基本上是向上轉(zhuǎn)換。
func someFunc<T:Base where T:protocol<MyProtocol1,MyProtocol2>>(val:T) {
// here, `val` is guaranteed to be `Base` and conforms `MyProtocol` and `MyProtocol2`
}
class SubClass:BaseClass, MyProtocol1, MyProtocol2 {
//...
}
let val = SubClass()
someFunc(val)
到目前為止,您所能做的就像:
class CellFactory {
class func createCellForItem(item: SpecialItem) -> UITableViewCell {
return ... // any UITableViewCell subclass
}
}
let cell = CellFactory.createCellForItem(special)
if let asProtocol = cell as? protocol<MyProtocol1,MyProtocol2> {
asProtocol.protocolMethod()
cell.cellMethod()
}
這樣,在技術(shù)上cell就等同于asProtocol。
但是,對(duì)于編譯器來(lái)說(shuō),cell只有接口UITableViewCell,而asProtocol只有協(xié)議接口。因此,當(dāng)您要調(diào)用UITableViewCell的方法時(shí),必須使用cell變量。當(dāng)您要調(diào)用協(xié)議方法時(shí),請(qǐng)使用asProtocol變量。
如果您確定單元格符合協(xié)議,則不必使用if let ... as? ... {}。喜歡:
let cell = CellFactory.createCellForItem(special)
let asProtocol = cell as protocol<MyProtocol1,MyProtocol2>
- 3 回答
- 0 關(guān)注
- 1165 瀏覽
添加回答
舉報(bào)