我遇到以下情况,我有一个通用协议(protocol) 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'
。
最佳答案
您的代码看起来不错 - 唯一的问题是 as
运算符需要 objc 兼容性。您可以通过在协议(protocol)前添加 @objc 属性来修复此问题:
@objc protocol A {}
@objc protocol B: A {
var foo: String { get }
}
不幸的是,这样做有一个缺点:你失去了使用 Objective C 中不可用的 swift 特定功能的能力,例如枚举、元组、泛型等。
关于swift - Swift 中的协议(protocol)向下转型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26760040/