我有一个简单的代码如下。 MySprite类(显示一个红色矩形)从类SKSpriteNode和协议ISprite扩展:
import SpriteKit
protocol ISprite {
func doSomething()
}
class MySprite: SKSpriteNode, ISprite {
var scence: SKScene?
init(theParent: SKScene) {
super.init(texture: nil, color: UIColor.redColor(), size: CGSizeMake(300, 300))
self.position = CGPointMake(500, 500)
scence = theParent
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func doSomething() {
}
}
class GameScene: SKScene {
override func didMoveToView(view: SKView) {
var mySprite:SKSpriteNode = MySprite(theParent: self)
self.addChild(mySprite)
}
}
代码可以编译并运行良好。但是,在将mySprite的类型从SKSpriteNode更改为ISprite后,我无法将其转发/向下转换回SKSpriteNode:
var mySprite:ISprite = MySprite(theParent: self)
self.addChild(mySprite as? SKSpriteNode!)
swift编译器说错误:"类型SKSpriteNode不符合协议ISprite"
关于错误和解决方案的任何想法?非常感谢!
答案 0 :(得分:3)
addChild期望SKNode不符合ISprite。它也可以采用SKNode的子类,例如SKSpriteNode。当mySprite是SKSpriteNode时,Swift可以保证addChild将获得SKSpriteNode。将mySprite强制转换为SKSpriteNode失败,因为SKSpriteNode不符合ISprite,因此Swift无法保证它将成为SKSpriteNode。您可以将mySprite强制转换为MySprite,它是SKNode的子类,因此addChild可以接受它:
addChild(mySprite as MySprite)