制作 属性 类型并符合 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]()
我想做一个 属性 是某种类型的并且也符合协议,我会在 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]()