我有下面的代码。如何解决最后一行中的错误?
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发布于 2014-06-20 00:09:32
更新:已在Swift 1.2+ (Xcode 6.3+)中修复。Xcode 6.3测试版说明说:
动态转换(“as!”,“as?”)现在使用Swift协议类型,只要它们没有关联类型。
您只能检查@objc 协议的协议一致性(包括is、as和as?)。Animal不是@objc。
请参阅Swift书的Checking for Protocol Conformance部分。
备注 只有当协议标记为@objc属性时,才能检查协议是否符合。
发布于 2014-06-19 05:58:00
你可以通过做
var cat = obj as Cat as Animal但这个解决办法几乎毫无用处..。因为您需要首先知道obj的类型
编辑:
正如@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。
发布于 2014-06-19 07:10:59
就我所观察到的情况而言,AnyObject只能是对类类型(†)实例的下向,而Any只能是下移到类型(类或其他类型),因此不可能将它们转换到协议中。
我不知道我是否会把它限定为一个bug,如果这样做仍然有效,那么它的实现可能是有原因的--但是@Bryan的解决方案(先转换为类型,然后转换到协议)至少“解决了错误”!
( AnyObject )值得注意的例外包括能够从†向下转换到核心数据类型Int、String等。
https://stackoverflow.com/questions/24299635
复制相似问题