如何在数组中变异变量?

时间:2015-10-05 20:10:59

标签: arrays swift

我正在尝试从我的数组中接收可变变量,但出了点问题。代码中的问题。

var baloonsArray = NSMutableArray()

override func didMoveToView(view: SKView) {
        var baloon = SKSpriteNode(imageNamed: "baloon") //"Variable "baloon" was never mutated; consider changing to "let" constant"
        baloon.xScale = 0.1
        baloon.yScale = 0.1

        ballonsArray.addObject(baloon)
        addChild(baloon)
}

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {

    for touch in touches {
        for var baloon in baloonsArray {
            baloon.xScale = 0.2 //Here xcode telling me: "Cannot assign to property: "ballon" is immutable". But i declared him as var. With Objective-C there was no problems. What should i do? 

        }
    }
}

当我试图在touchesBegan函数xcode中更改baloon xScale时告诉我:“不能赋予属性:”ballon“是不可变的”。但我宣布他为var。使用Objective-C没有问题。我该怎么办?

2 个答案:

答案 0 :(得分:2)

问题是你使用NSMutableArray。对斯威夫特来说,它是不透明的。也就是说,斯威夫特不知道它里面有什么。但斯威夫特有严格的打字。因此,它不知道它的元素具有哪些属性,并且它不会让您分配给它不理解的属性。因此,如果您真的想使用NSMutableArray,则在获取它们时必须强制转换元素,因此Swift知道它们是什么:

for baloon in baloonsArray {
    let baloonsprite = baloon as! SKSpriteNode
    baloonsprite.xScale = 0.2
}

有效。但是,最好不要首先使用NSMutableArray。相反,将baloonsArray声明为可变的 Swift 数组:

var baloonsArray = [SKSpriteNode]()

以更简洁的方式解决问题。现在Swift知道这个数组中的内容 - 它是SKSpriteNode对象。 Swift知道可以分配给SKSpriteNode的xScale

你需要习惯Swift的严格打字,包括输入数组元素这一事实。

答案 1 :(得分:1)

第1点

在以下代码中,您定义了一个变量balloon

此变量一直存在,直到它在方法结束时超出范围,就在}之前的瞬间。

override func didMoveToView(view: SKView) {
    var balloon = SKSpriteNode(imageNamed: "baloon") //"Variable "baloon" was never mutated; consider changing to "let" constant"
    balloon.xScale = 0.1
    balloon.yScale = 0.1

    ballonsArray.addObject(balloon)
    addChild(balloon)
}

现在,此变量引用类型为SKSpriteNode的对象。这意味着变量是pointer,更具体地说它包含一个数字,它是堆内精灵的地址。

如果更改精灵的某些属性,则更改变量,实际上变量balloon仍然包含精灵的地址到堆中。所以你不要改变它。

变异变种balloon的唯一方法是将其分配给另一个SKSpriteNode。你没有这样做,所以警告是正确的。

第2点

亚特的答案是完全正确的。

您还可以考虑不使用NSMutableArray。 Swift本机数组要好得多,并支持泛型。所以你可以避免演员。

class Scene : SKScene {

    var ballonsArray = [SKSpriteNode]()

    override func didMoveToView(view: SKView) {
        let balloon = SKSpriteNode(imageNamed: "baloon")
        balloon.xScale = 0.1
        balloon.yScale = 0.1
        ballonsArray.append(balloon)
        addChild(balloon)
    }

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        ballonsArray.map { $0.xScale = 0.2 }
    }
}

希望这有帮助。