从Any到Downcast协议

我有以下代码。 如何解决最后一行中的错误?

protocol Animal { func walk() } struct Cat: Animal { func walk() {} init() { } } var obj: Any = Cat() var cat = obj as Animal // ERROR: cannot downcast from Any to unrelated type Animal 

更新:这已被修复Swift 1.2+(Xcode 6.3+)。 Xcode 6.3 beta发行说明说:

dynamic转换(“as!”,“as?”和“is”)现在可以与Swift协议types一起使用,只要它们没有关联的types。


您只能使用@objc协议来检查协议一致性(包括, isasas? )。 Animal不是@objc

请参阅Swift书的“ 检查协议一致性”部分。

注意

只有在协议标记为@objc属性的情况下,才能检查协议一致性

你可以通过做,来解决它

  var cat = obj as Cat as Animal 

但是这个解决方法几乎是无用的…因为你需要首先知道obj的types


编辑:

正如@newacct所指出的那样,这不是bug,请参阅他的回答以获取更多信息

 xcrun swift Welcome to Swift! Type :help for assistance. 1> 2> @objc protocol Animal { 3. func walk() 4. } @objc class Cat: Animal { func walk() {} init() { } } var obj: AnyObject = Cat() var cat = obj as Animal 5> 6> @objc class Cat: Animal { 7. func walk() {} 8. 9. init() { } 10. } 11> 12> var obj: AnyObject = Cat() obj: Cat = {} 13> 14> var cat = obj as Animal cat: Cat = {} 15> 

Animal协议需要@objc属性, Cat需要是@objc class

我的方法

 @objc protocol Animal { func walk() } @objc class DummyAnimal: Animal { func walk() { } } @objc class Cat: DummyAnimal { override func walk() { print("meow") } override init() { } } var obj: Any = Cat() var cat = obj as DummyAnimal cat.walk() 

就我所能观察到的, AnyObject只能被downcast为类types的实例(†),而Any只能被downcast为types(类或其他types),所以不可能它们转换为协议。

我不知道我是否可以将其视为一个错误,如果这样做,那么也许这是因为一个很好的理由而实现的 – 但是@ Bryan的解决方法(首先是types转换,然后是一个协议)至less是“解决错误“!

(†)明显的例外包括能够从AnyObject向下转换为核心数据typesInt,String等