如果我有以下代码:
class MyClass {
...
}
protocol MyProtocol {
...
}
是否可以声明一个接受MyClass
符合MyProtocol
的类或子类的类型?
e.g。在伪代码中:
var thing: MyClass & MyProtocol = ...
答案 0 :(得分:0)
天真的方法有效(即首先指定类型,然后在变量声明中使用它):
class MCImplementingMP: MyClass, MyProtocol {
}
var thing: MCImplementingMP = ...
答案 1 :(得分:0)
不,在Objective-C中它是可能的,但在Swift中是不可能的。 我所知道的所有解决方案看起来都很糟糕,需要大量的运行时类型检查。所以我自己出来了 - 声明一个包装类型,根据具体情况,它可以像所需的类或协议一样:
class MyClass {}
protocol MyProtocol: class {}
class Wrapper {
var instance: AnyObject
init?(instance: MyClass) {
guard instance is MyProtocol else { return nil }
self.instance = instance
}
init?(instance: MyProtocol) {
guard instance is MyClass else { return nil }
self.instance = instance
}
var instanceAsMyClass: MyClass {
return instance as! MyClass
}
var instanceAsMyProtocol: MyProtocol {
return instance as! MyProtocol
}
}
您可能想要更改属性名称,但想法很明确。