我需要声明一个UIView
类型的变量,它也符合MyProtocol
:
protocol MyProtocol: class {
func foobar()
}
class MyClass {
var myView: UIView<MyProtocol>! // Error: Cannot specialize non-generic type 'UIView'
}
但是我得到了编译器错误:无法专门化非泛型类型'UIView'。
我需要访问来自UIView
和MyProtocol
的变量的方法。
支持这些要求的正确变量声明是什么?
如果它有任何区别,只有UIView
个子类将实现该协议。目前,我通过扩展添加协议一致性。
我找到了这个答案:https://stackoverflow.com/a/25771265/233602但是当在Swift 2中写作时,这个答案仍然是最好的选择还不清楚。
答案 0 :(得分:9)
使您的类成为通用类,如下所示,
protocol MyProtocol: class {
func foobar()
}
class MyClass<T:MyProtocol where T:UIView> {
var myView: T!
}
上面的错误说UIView不能专门用于协议MyProtocol,因此,这里的解决方案是使你的类成为一个泛型类,它接受符合MyProtocol的泛型参数,并且是UIView的子类。
答案 1 :(得分:5)
解决此问题的最佳方法可能是使用所有UIViews
符合的协议:
protocol UIViewType {
var view: UIView { get }
}
extension UIView: UIViewType {
var view: UIView { return self }
}
// the variable
var myView: protocol<UIViewType, MyProtocol>
使用view
属性访问UIView
特定功能。
答案 2 :(得分:1)
这里晚了聚会,但是SE-0156(由Swift 4采用)可以在类型声明中启用类和协议的组成,而无需(重新分类为?)泛型。
protocol MyProtocol: class {
func foobar()
}
class MyClass {
var myView: (UIView & MyProtocol)!
}
答案 3 :(得分:0)
如果有什么不同,只有UIView子类将实现 协议。
一切都与众不同!只需这样做:
protocol MyProtocol: UIView {
func foobar()
}
class MyClass {
var myView: MyProtocol!
}