3 回答
TA貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超4個(gè)贊
采用該協(xié)議Fooable告訴編譯器此特定UIViewController響應(yīng)foo(),至少如此。
在相反的結(jié)論,F(xiàn)ooable并沒有成為UIViewController必然。
如果受影響的類不是,約束Self: UIViewController只是編譯器在編譯時(shí)抱怨的另一信息。UIViewController
在您的情況下SampleViewController,F(xiàn)ooable對(duì)編譯器進(jìn)行批注僅知道SampleViewController對(duì)作出響應(yīng)foo()。它不知道類型實(shí)際上是的子類UIViewController。
因此,如果要訪問具體類的屬性,請(qǐng)不要在協(xié)議中為具體類注釋。
但是,您可以將show方法和其他常見屬性/方法添加到協(xié)議中
protocol Fooable: class where Self: UIViewController {
func foo()
func show(_ vc: Fooable, sender: Any?)
}
那么您可以使用,F(xiàn)ooable因?yàn)榫幾g器知道采用協(xié)議的類型會(huì)響應(yīng)該方法。
例如,當(dāng)您要?jiǎng)?chuàng)建異構(gòu)但受限制的集合類型時(shí),將類型注釋為協(xié)議的合適做法是
let array : [CustomStringConvertible] = ["Foo", 1, false]
array.forEach{ print("\($0)")}
該代碼使用description所有項(xiàng)目都響應(yīng)的屬性打印三個(gè)項(xiàng)目。編譯器可識(shí)別的三個(gè)項(xiàng)目如其中有一個(gè)類型的description財(cái)產(chǎn),還不如String,Int和Bool。
更新:
在Swift 5中,實(shí)現(xiàn)了對(duì)超類約束協(xié)議的支持。
TA貢獻(xiàn)1865條經(jīng)驗(yàn) 獲得超7個(gè)贊
常見的模式是這樣做的:
protocol Fooable {
func foo()
var viewController: UIViewController
}
class SampleViewController: UIViewController, Fooable {
func foo() {
print("foo")
}
var viewController: UIViewController { return self }
}
在Swift 4中,您可以使類型為var UIViewController & Fooable。在Swift 3中使用上述技巧。
- 3 回答
- 0 關(guān)注
- 502 瀏覽
添加回答
舉報(bào)
