2014-06-06 14 views
15

Zadeklarowałem tablicę przy użyciu var i wypełniłem ją w ramach init(). Jednak kiedy próbuję mutować tę tablicę, dostaję mnóstwo błędów, informujących o tym, że tablica jest niezmienna. Czego tu mi brakuje?Niezmienna wartość ma tylko elementy mutujące

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 
    } 
} 

Błędy Dostaję:

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 

Odpowiedz

27

struct uważany jest typ wartości, więc jest to niezmienne domyślnie. Jeśli chcesz go zmienić za pomocą metody, musisz zadeklarować metodę mutating. Cytując książkę Swift:

Struktury i wyliczenia są typami wartości. Domyślnie właściwości typu wartości nie można modyfikować w ramach metod instancji .

Jeśli jednak chcesz zmodyfikować właściwości swojej struktury lub wyliczenia w ramach konkretnej metody, możesz włączyć funkcję mutowania dla tej metody. Metoda może następnie zmutować (to znaczy zmienić) jej właściwości z metody, a wszelkie zmiany, które powoduje, że są , są zapisywane z powrotem do oryginalnej struktury po zakończeniu metody. Metoda może również przypisać zupełnie nową instancję do swojej domyślnej właściwości self , a ta nowa instancja zastąpi istniejącą, gdy zakończy się metoda .

Możesz wyrazić zgodę na to zachowanie, umieszczając słowo kluczowe mutating przed dla słowa kluczowego func dla tej metody.

+3

Niesamowite, dzięki! Tak było. Musiałem zmienić 'let deck = Deck()' na 'var deck = Deck()', aby to działało. –

+1

To dlatego, że z 'let deck = Deck()' zdefiniowałeś 'Deck' jako niezmienny i próbujesz go zmutować za pomocą funkcji shuffle. Zastanawiam się, czy zmiana struktury na klasę byłaby lepszym rozwiązaniem, jeśli chcesz robić tego rodzaju rzeczy. –

+0

Korzystanie z zajęć to zdecydowanie lepsze podejście do tego pomysłu. –

Powiązane problemy