Неизменяемое значение имеет только мутирующие элементы

Я объявил массив с помощью 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

A struct считается типом значения, поэтому по умолчанию он неизменен. Если вы хотите изменить его с помощью метода, вы должны объявить метод mutating. Цитирование книги Swift:

Структуры и перечисления представляют собой типы значений. По умолчанию свойства типа значения не могут быть изменены из его экземпляра Методы.

Однако, если вам нужно изменить свойства вашей структуры или перечисление в рамках конкретного метода, вы можете выбрать мутацию поведение для этого метода. Затем этот метод может мутировать (то есть изменять) его свойства из метода и любые изменения, которые он делает записываются обратно в исходную структуру, когда метод заканчивается. метод может также назначить совершенно новый экземпляр его неявному я свойство, и этот новый экземпляр заменит существующий, когда метод заканчивается.

Вы можете выбрать это поведение, разместив ключевое слово mutating до ключевое слово func для этого метода.