首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从任何协议降到协议

从任何协议降到协议
EN

Stack Overflow用户
提问于 2014-06-19 05:52:44
回答 4查看 11.1K关注 0票数 14

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

代码语言:javascript
复制
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
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-06-20 00:09:32

更新:已在Swift 1.2+ (Xcode 6.3+)中修复。Xcode 6.3测试版说明说:

动态转换(“as!”,“as?”)现在使用Swift协议类型,只要它们没有关联类型。

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

请参阅Swift书的Checking for Protocol Conformance部分。

备注 只有当协议标记为@objc属性时,才能检查协议是否符合。

票数 13
EN

Stack Overflow用户

发布于 2014-06-19 05:58:00

你可以通过做

代码语言:javascript
复制
 var cat = obj as Cat as Animal

但这个解决办法几乎毫无用处..。因为您需要首先知道obj的类型

编辑:

正如@newacct所指出的,这不是bug,更多信息请参见他的回答。

代码语言:javascript
复制
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

票数 3
EN

Stack Overflow用户

发布于 2014-06-19 07:10:59

就我所观察到的情况而言,AnyObject只能是对类类型(†)实例的下向,而Any只能是下移到类型(类或其他类型),因此不可能将它们转换到协议中。

我不知道我是否会把它限定为一个bug,如果这样做仍然有效,那么它的实现可能是有原因的--但是@Bryan的解决方案(先转换为类型,然后转换到协议)至少“解决了错误”!

( AnyObject )值得注意的例外包括能够从†向下转换到核心数据类型Int、String等。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24299635

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档