2015-10-13 55 views
4

符合協議我需要聲明UIView類型的變量,它也符合MyProtocol聲明類型的變量的UIView在斯威夫特2

protocol MyProtocol: class { 
    func foobar() 
} 

class MyClass { 
    var myView: UIView<MyProtocol>! // Error: Cannot specialize non-generic type 'UIView' 
} 

但是我得到的編譯器錯誤:無法專注非泛型類型'的UIView'。

我需要訪問變量從UIViewMyProtocol上的方法。

什麼是正確的變量聲明來支持這些要求?

如果有區別,只有UIView子類將實現該協議。目前我通過擴展添加協議一致性。

我發現了這樣的回答:https://stackoverflow.com/a/25771265/233602但如果這個問題的答案仍然是要在最好的選擇中斯威夫特2

回答

9

讓你的類泛型類如下書寫時,它不是明確的,

protocol MyProtocol: class { 
    func foobar() 
} 

class MyClass<T:MyProtocol where T:UIView> { 
    var myView: T! 
} 

上面的錯誤表明,UIView不能專門用於協議MyProtocol,因此,這裏的解決方案將使您的類成爲一個泛型類,它採用符合MyProtocol的泛型參數,並且是UIView的子類。

6

可能解決這個最好的方法是使用一個協議,其中所有UIViews符合:

protocol UIViewType { 
    var view: UIView { get } 
} 

extension UIView: UIViewType { 
    var view: UIView { return self } 
} 

// the variable 
var myView: protocol<UIViewType, MyProtocol> 

使用view屬性來訪問UIView特定功能。

+0

如果你不需要將這個協議的一個實例傳遞給一個使用'UIView'的函數,那麼這個地方不適用的一個值得注意的例子。 – mxcl