我正在尝试从我的数组中接收可变变量,但出了点问题。代码中的问题。
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没有问题。我该怎么办?
答案 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)
在以下代码中,您定义了一个变量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
。你没有这样做,所以警告是正确的。
亚特的答案是完全正确的。
您还可以考虑不使用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 }
}
}
希望这有帮助。