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语言中,如枚举的能力,元组,仿制药等

此处了解详情:Checking for Protocol Conformance

+0

开溜,期待@objc死亡。谢谢! – 2014-11-05 15:19:12

+0

在感兴趣的地方添加指向文档的链接 – Antonio 2014-11-05 15:22:08