不可变价值只有变异成员

时间:2014-06-06 06:03:40

标签: 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
    }
}

我得到的错误:

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

1 个答案:

答案 0 :(得分:27)

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

  

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

     

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

     

您可以通过放置mutating关键字来选择此行为   该方法的func关键字。