Abatido desde cualquier a un protocolo

tengo el siguiente código. ¿Cómo puedo resolver el error en la última línea?

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 

Actualización: esto se ha solucionado en Swift 1.2+ (Xcode 6.3+). Las notas de la versión beta de Xcode 6.3 dicen:

Los models dynamics ("como!", "Como" y "es") ahora funcionan con types de protocolo Swift, siempre que no tengan types asociados.


Solo puede verificar si la conformidad del protocolo (que incluye is , as y as? ) con un protocolo @objc . Animal no es @objc .

Consulte la sección Comprobación de la conformidad del protocolo del libro Swift.

NOTA

Puede verificar la conformidad del protocolo solo si su protocolo está marcado con el atributo @objc

Puedes solucionarlo haciendo

  var cat = obj as Cat as Animal 

pero esta solución es casi inútil … porque necesita saber el tipo de obj primero


Editar:

Como @newacct señala, no es un error, vea su respuesta para get más información.

 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 protocolo Animal necesita @objc atributo @objc y Cat necesita ser @objc class .

Mi acercamiento

 @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() 

Por lo que he podido observar, AnyObject solo puede descender a una instancia de types de class (†) y Any solo puede descender a types (class o no), no es posible convertirlos en un protocolo.

No sé si califico esto como un error o no, si es así, tal vez se implementó de esta manera por una buena razón, pero la solución de @ Bryan (convertir a un tipo primero y luego a un protocolo) al less " resuelve el error "!

(†) las excepciones notables incluyen la posibilidad de abatir desde AnyObject a los types de datos centrales Int, String, etc.