【发布时间】:2019-05-16 18:18:19
【问题描述】:
在下面的代码中,一个名为Card 的结构被分配了let。然后,一旦分配,我将这张卡放入一个数组中。现在,在func resetCards 中,我想将数组中的每张卡片设置回其原始状态。但是,如果我对数组中的每张卡使用 for 循环,我会收到错误消息 "cannot assign property to constant",这是我所期望的。但是,如果我执行以下操作:cards[0].variable = false,则不会出现错误,并且可以更改结构变量。为什么如果我使用 for card in cards 循环遍历数组,即使使用 var 声明属性,我也无法更改结构的属性,但是如果我使用数组索引访问结构,例如for index in cards.indices可以吗?
class Concentration {
var cards = [Card]()
init(numberOfPairsOfCards: Int) {
for _ in 0..<numberOfPairsOfCards {
let card = Card()
cards += [card, card]
}
func resetCards() {
indexOfOneAndOnlyFaceUpCard = nil
for card in cards {
card.variable = true // this doesn't work
cards[0].variable = true // this works
}
}
}
【问题讨论】:
-
你希望‘cards += [card, card]’这行代码做什么?
-
基本上我是在创造游戏集中度。因此,对于我创建的每张新卡片,我还需要创建一个相同的副本并将其添加到卡片数组中。该数组包含所有卡片,并且每张卡片必须有两张且只有两张。
-
这不会添加卡片的副本,列表将包含指向同一实例的指针。
-
@nick 它会创建一个副本,因为结构是值类型而不是引用类型。所以
cards += [card, card]创建了两个不相互引用的唯一副本,即更改一个不会更改另一个。但是,如果Card是一个类而不是一个结构,那么你是正确的。
标签: swift