在Objective-C中,可以这样写:

@property(retain) UIView<Protocol1, Protocol2, ...> *myView;

但是如何快速编写此代码?

我已经知道如何使一个属性符合许多协议(protocol),但是使用继承不能正常工作:
var myView: ??? protocol<Protocol1, Protocol2, ...>

编辑:

我使用许多UIView子类型,例如UIImageViewUILabel或其他,并且我需要使用某些UIView属性以及协议(protocol)中定义的某些方法。在最坏的情况下,我可以使用所需的属性创建UIViewProtocol,但是我想知道在Swift中是否可以声明具有类型和某种协议(protocol)的属性/变量。

最佳答案

您可以使用where clause通过泛型类执行此操作:



要使用它,请使用type constraint在通用类中定义您的属性的类,以检查属性的type parameter是否与所需的基类和协议(protocol)相匹配。

对于您的特定示例,它可能看起来像这样:

class MyViewController<T where T: UIView, T: Protocol1, T: Protocol2>: UIViewController {
    var myView: T

    // ...
}

10-08 13:28
查看更多