Swift中的协议向下转换

时间:2014-11-05 14:48:45

标签: swift

我有以下情况:我有一个通用协议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'

1 个答案:

答案 0 :(得分:2)

您的代码看起来很好 - 唯一的问题是as运算符需要objc兼容性。您可以通过在协议前添加@objc属性来修复它:

@objc protocol A {}

@objc protocol B: A {
    var foo: String { get }
}

不幸的是,这样做有一个缺点:你失去了使用目标C中没有的快速特定功能的能力,例如枚举,元组,泛型等。

此处有更多信息:Checking for Protocol Conformance