我有以下情况:我有一个通用协议A
,它可以包含从中继承的变体(例如B
)和一个实现变体的类(C
)。
protocol A {}
protocol B: A {
var foo: String { get }
}
class C: B {
let foo: String = "foo"
}
现在,如果我有A
类型的对象,但实际上是C
,我怎样才能获得B
中声明的内容?
func foo() {
let c: A = C()
}
如果我尝试像let b = c as B
那样进行投射,我会Cannot downcast from 'A' to non-@objc protocol type 'B'
。
答案 0 :(得分:2)
您的代码看起来很好 - 唯一的问题是as
运算符需要objc兼容性。您可以通过在协议前添加@objc属性来修复它:
@objc protocol A {}
@objc protocol B: A {
var foo: String { get }
}
不幸的是,这样做有一个缺点:你失去了使用目标C中没有的快速特定功能的能力,例如枚举,元组,泛型等。