我有一个简单的代码如下。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/

10-13 09:26