Swift报错:'SKNode'类型无'rotate'成员,问题原因咨询
问题原因及解决方案
这个报错的核心原因是变量类型不匹配——你声明的robber变量类型是SKNode,而非你自定义的Robber类。
Swift是静态类型语言,编译器会严格依据变量的声明类型来判断它能调用的方法。哪怕你给SKNode类型的变量赋值了Robber实例,编译器依然只会把它当成SKNode处理——而SKNode本身并没有你自定义的rotate方法,所以就会抛出Value of type 'SKNode' has no member 'rotate'的错误。
从你的代码片段也能看出端倪:
func addRobber(){ lastRobber = false robber = Robber(x: Int(frame.width),y: Int(frame.height),h:Int(frame.height),so:sOp) self.addChild(robber as Robber) // 这里的强制转换已经暗示robber的声明类型是SKNode }
你不得不把robber强制转换成Robber才能添加到场景中,这说明robber的声明类型是SKNode(比如var robber: SKNode?)。
解决方法
有两种处理方式,推荐第一种:
方式一:修正变量声明类型(推荐)
把robber变量的类型明确声明为Robber,比如:var robber: Robber? // 或者根据你的需求用Robber!这样后续赋值和调用方法时都不需要强制转换,直接调用
robber?.rotate()就能正常工作,添加到场景的代码也可以简化为self.addChild(robber!)(如果是可选类型需要安全解包)。方式二:调用时强制类型转换(仅适用于无法修改变量类型的场景)
如果你必须保持robber为SKNode类型,调用方法前可以先做类型转换:(robber as? Robber)?.rotate()这种方式需要处理可选绑定,避免类型转换失败导致崩溃,不过显然不如第一种方式直接优雅。
内容的提问来源于stack exchange,提问作者wohnioh
相关产品推荐
相关产品推荐

