为什么不能在初始化函数中设置 SKSprite 的名称?

Why can not set name of SKSprite in its init function?

我扩展了 SKSpriteNode 并想在它的初始化函数中设置它的名称属性:

class Ship: SKSpriteNode {


    var id: Int

    /**
     *  Image name of sprite image for this bubble.
     **/
    var image: String

    //some other vars but NOT name, because its super class SKNode has already name

    init(ship: (name: String, <other vars>), position: CGPoint) {

        let texture = SKTexture(imageNamed: self.image)
        super.init(texture: texture, color: UIColor.clearColor(), size: texture.size())
        self.name = name //here I set its name!!!
        self.position = position

        self.physicsBody = SKPhysicsBody(circleOfRadius: self.size.width / 2)
        self.physicsBody!.dynamic = true
    }

    required init(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

但后来,当我创建一个 'Ship' 时(ship[1] 是一些值,包括名称):

var titanic = Ship(ship: ship[1], position: shipPosition!)
println(titanic.name) //nil
self.addChild(titanic)
titanic.name = 'titanic'
println(titanic.name) //titanic

如您所见 - 名称未在初始化时设置 - 我必须在创建后设置它。

如何在它的初始化方法中设置这个名字?还是只能在创建后才命名?

在此上下文中,self.name = name 实际上与 self.name = self.name 的意思相同。

您正试图在 tuple 中传递变量,因此您可能需要 self.name = ship.name。 (甚至 name = ship.name。)

或者,您可以将这些全部作为参数直接传递给初始化程序:

init(named name: String, <other vars>, position: CGPoint) {
    // ...
    self.name = name
}

Ship(named: "titanic", <other vars>, position: shipPosition!)

你看过这个吗:How to get SKSpriteNode name?

尝试

sprite1.name = @"sprite1";

正如@jtbandes 指出的那样,直接初始化名称可能更容易。