制作 属性 类型并符合 Swift 中的协议

Make property of type and also conform to protocol in Swift

我想做一个 属性 是某种类型的并且也符合协议,我会在 Objective-C 中这样做:

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

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

class CustomViewController : UIViewController, CustomProtocol {}

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

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

type → array-type­ | dictionary-type­ | function-type­ | type-identifier­ | tuple-type­ | optional-type­ | implicitly-unwrapped-optional-type­ | protocol-composition-type­ | metatype-type­

您正在寻找的是一种 协议组合类型 ,它也接受基数 class。 (Protocol-combination-type is protocol<Proto1, Proto2, Proto3, …>。)但是,目前这是不可能的。

允许具有关联类型要求的协议具有指定所需基础 class 和所需协议的类型别名,但这些还要求类型在编译时已知,因此不太可能成为可行的给你的选择。

如果你真的喜欢它,你可以用你使用的 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>
}

现在可以使用内置合成:

var children = [UIViewController & NavigationScrollable]()