3 回答

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

TA貢獻1865條經(jīng)驗 獲得超7個贊
常見的模式是這樣做的:
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)注
- 480 瀏覽
添加回答
舉報