声明符合Swift 2协议的UIView类型的变量

时间:2015-10-13 15:48:05

标签: swift protocols swift2

我需要声明一个UIView类型的变量,它也符合MyProtocol

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但是当在Swift 2中写作时,这个答案仍然是最好的选择还不清楚。

4 个答案:

答案 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!
}