不可变价值只有变异成员

Gui*_*man 16 arrays sorting swift

我已声明一个数组使用var并填充它init().然而,当我尝试改变那个数组时,我得到了大量错误,告诉我数组是不可变的.我在这里错过了什么?

struct Deck {
    var cards: Card[] = []

    init () {
        for i in 1...4 {
            for ii in 1...13 {
                self.cards.append(Card(rank: Rank.fromRaw(ii)!, suit: Suit.fromRaw(i)!))
            }
        }
    }

    func shuffle () {
        var shuffledDeck: Card[] = []
        var count = self.cards.count

        for i in 1...52 {
            var limit = count - i
            var key = Int(arc4random_uniform(UInt32(limit)));
            shuffledDeck.append(self.cards[key])
            self.cards.removeAtIndex(key)
        }

        self.cards = shuffledDeck
    }
}
Run Code Online (Sandbox Code Playgroud)

我得到的错误:

Playground execution failed: error:
<REPL>:75:22: error: immutable value of type 'Card[]' only has mutating members named 'removeAtIndex'
            self.cards.removeAtIndex(key)
                 ^     ~~~~~~~~~~~~~
<REPL>:78:24: error: cannot assign to 'cards' in 'self'
            self.cards = shuffledDeck
Run Code Online (Sandbox Code Playgroud)

zou*_*oul 27

A struct被认为是值类型,因此默认情况下它是不可变的.如果要使用方法更改它,则必须声明方法mutating.引用Swift书:

结构和枚举是值类型.默认情况下,无法在其实例方法中修改值类型的属性.

但是,如果需要在特定方法中修改结构或枚举的属性,则可以选择改变该方法的行为.然后,该方法可以从方法中改变(即更改)其属性,并且当方法结束时,它所做的任何更改都将写回原始结构.该方法还可以为其隐式self属性分配一个全新的实例,并且该新实例将在方法结束时替换现有实例.

您可以通过将mutating关键字放在该方法的关键字之前来选择此行为func.

  • 太好了,谢谢!这样做了.我不得不将`let deck = Deck()`更改为`var deck = Deck()`以使其工作. (3认同)