一尘不染

使类型的属性也符合Swift中的协议

swift

我想创建一个具有某种类型并且也符合协议的属性,就像我在Objective-C中所做的那样:

@property (nonatomic) UIViewController<CustomProtocol> *controller;

我要寻找的是指定可以使用也符合CustomProtocol的UIViewController类型的对象设置属性,以便清楚什么是基类。我知道我可以只使用短类存根来获得相同的结果,即

class CustomViewController : UIViewController, CustomProtocol {}

但这似乎不是最干净的方法。


阅读 179

收藏
2020-07-07

共1个答案

一尘不染

我想不出一种在Swift中表达这一点的好方法。类型语法是:

类型→数组类型| 字典类型| 功能类型| 类型标识符| 元组类型| 可选类型| 隐式展开的可选类型| 协议组成类型| 元型

您正在寻找的是一种也可以接受基类的 协议组合类型 。( 协议组合类型protocol<Proto1, Proto2, Proto3, …>。)但是,当前这是不可能的。

允许具有相关类型要求的协议具有指定所需的基类和所需协议的类型别名,但是这些也要求在编译时就知道类型,因此对于您而言,这不太可能是一个可行的选择。

如果您真的很喜欢它,则可以UIViewController使用所用接口的一部分定义协议,使用扩展名添加一致性,然后使用protocol<UIViewControllerProtocol, CustomProtocol>

protocol UIViewControllerProtocol {
    func isViewLoaded() -> Bool
    var title: String? { get set }
    // any other interesting property/method
}

extension UIViewController: UIViewControllerProtocol {}

class MyClass {
    var controller: protocol<UIViewControllerProtocol, CustomProtocol>
}
2020-07-07