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

时间:2015-04-26 18:21:37

标签: swift uiviewcontroller swift-protocols

我想创建一个特定类型的属性并且也符合协议,我会在Objective-C中这样做:

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

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

class CustomViewController : UIViewController, CustomProtocol {}

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

2 个答案:

答案 0 :(得分:7)

我想不出一个在Swift中表达这个的好方法。 syntax for a type是:

  

type→array-type |字典型|功能型| type-identifier |   元组类型|可选类型|隐式解包 - 可选类型|   protocol-composition-type |元类型型

您正在寻找的是一种协议组合类型,它也接受基类。 (协议组合类型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>
}

答案 1 :(得分:7)

现在可以使用内置合成:

var children = [UIViewController & NavigationScrollable]()