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

sas*_*ade 11 uiviewcontroller swift swift-protocols

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

@property (nonatomic) UIViewController<CustomProtocol> *controller;
Run Code Online (Sandbox Code Playgroud)

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

class CustomViewController : UIViewController, CustomProtocol {}
Run Code Online (Sandbox Code Playgroud)

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

jws*_*art 9

现在可以使用内置组合:

var children = [UIViewController & NavigationScrollable]()


zne*_*eak 7

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

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>
}
Run Code Online (Sandbox Code Playgroud)