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

And*_*ing 5 protocols swift swift2

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

protocol MyProtocol: class {
    func foobar()
}

class MyClass {
    var myView: UIView<MyProtocol>! // Error: Cannot specialize non-generic type 'UIView'
}
Run Code Online (Sandbox Code Playgroud)

但是我得到了编译错误:无法专门化非泛型类型'UIView'.

我需要从UIView和访问变量的方法MyProtocol.

支持这些要求的正确变量声明是什么?

如果它有任何区别,只有UIView子类才会实现协议.目前,我通过扩展添加协议一致性.

我找到了这个答案:https://stackoverflow.com/a/25771265/233602但不清楚在Swift 2中写这个答案是否仍然是最好的选择.

San*_*eep 10

使您的类成为通用类,如下所示,

protocol MyProtocol: class {
    func foobar()
}

class MyClass<T:MyProtocol where T:UIView> {
    var myView: T!
}
Run Code Online (Sandbox Code Playgroud)

上面的错误说UIView不能专门用于协议MyProtocol,因此,这里的解决方案是使你的类成为一个泛型类,它接受符合MyProtocol的泛型参数,并且是UIView的子类.


Qby*_*yte 5

解决这个问题的最佳方法可能是使用一个UIViews符合以下条件的协议:

protocol UIViewType {
    var view: UIView { get }
}

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

// the variable
var myView: protocol<UIViewType, MyProtocol>
Run Code Online (Sandbox Code Playgroud)

使用该view属性可以访问UIView特定功能.

  • 如果您需要将此协议的实例传递给采用UIView的函数,那么这是不合适的。 (3认同)