Swift中的协议向下转换
问题描述:
我有以下情况,其中我有一个通用协议A
,它可能具有从其继承的变体(例如B
)和一个实现变体(C
)的类。Swift中的协议向下转换
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 [email protected] protocol type 'B'
。
答
你的代码看起来不错 - 唯一的问题是as
运算符需要objc兼容性。
@objc protocol A {}
@objc protocol B: A {
var foo: String { get }
}
不幸的是做一个缺点:您可以通过与@objc属性前缀的协议,解决它,你失去了使用SWIFT特有的功能,是不是在客观C语言中,如枚举的能力,元组,仿制药等
开溜,期待@objc死亡。谢谢! – 2014-11-05 15:19:12
在感兴趣的地方添加指向文档的链接 – Antonio 2014-11-05 15:22:08