Swift:如何输入一个特定的协议?

时间:2015-02-23 01:39:43

标签: xcode swift casting sprite-kit protocols

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

关于错误和解决方案的任何想法?非常感谢!

1 个答案:

答案 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)