我有一个简单的代码如下。MySprite类(显示红色矩形)是从SKSpriteNode类和protocol 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协议”
你知道错误和解决方法吗?非常感谢!
最佳答案
addChild需要的SKNode不符合ISprite。它也可以接受SKNode的一个子类,例如SKSpriteNode。当mySprite是SKSpriteNode时,Swift可以保证addChild将获得SKSpriteNode。将mySprite转换为SKSpriteNode失败,因为SKSpriteNode不符合ISprite,所以Swift无法保证它将是SKSpriteNode。您可以将mySprite强制转换为mySprite,这是SKNode的一个子类,因此addChild可以接受它:
addChild(mySprite as MySprite)
关于xcode - Swift:如何将类型转换为特定协议(protocol)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28665762/