我想创建一个特定类型的属性并且也符合协议,我会在Objective-C中这样做:
@property (nonatomic) UIViewController<CustomProtocol> *controller;
我正在寻找的是指定可以使用类型为UIViewController的对象设置属性,该对象也符合CustomProtocol,以便清楚基类是什么。我知道我可能只是使用短类存根来获得相同的结果,即
class CustomViewController : UIViewController, CustomProtocol {}
但这似乎不是最干净的方法。
答案 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]()