2014-10-14 5 views
-1

Я попытался выполнить следующий простой пример карты, но продолжаю получать ошибку при попытке получить доступ к свойству Array. В частности, в func getRandomCard() карты становятся недоступными после нажатия кнопки Flip. Поведение непоследовательно, иногда ошибка возникает при первом нажатии кнопки, а в другое время кнопка может быть нажата несколько раз до возникновения ошибки. Что я делаю не так? Спасибо за понимание.Swift Array плохой доступ

//Class PlayingCardDeck 
import Foundation 

let validSuits = ["♣️", "♦️", "♥️", "♠️"] 
let maxRank = 13 

class PlayingCardDeck { 
    var cards: [PlayingCard] = [] 

    init() { 
     for suit in validSuits { 
      for rank in 1...maxRank { 
       var card = PlayingCard() 
       card.suit = suit 
       card.rank = rank 
       self.addCard(card) 
      } 
     } 
    } 

    func addCard(aCard: PlayingCard) { 
     cards.append(aCard) 
    } 

    func getRandomCard() -> PlayingCard { 
     let idx = Int(arc4random()) % cards.count 
     let retCard = cards[idx] 
     cards.removeAtIndex(idx) 
     return retCard 
    } 
} 

//Class PlayingCard 
import Foundation 

let rankStrings = ["?", "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"] 

class PlayingCard {  
    var suit = "?" 
    var rank = 0 

    var contents: String { 
     get { 
      return rankStrings[rank] + suit 
     } 
    } 
} 


//Class ViewController 
import UIKit 

class ViewController: UIViewController { 

    var myDeck = PlayingCardDeck() 

    @IBOutlet weak var cardLabel: UILabel! 

    @IBAction func flipButton(sender: UIButton) { 
     let s = myDeck.getRandomCard().contents 
     cardLabel.text = s 
    } 
} 
+0

Убедитесь, что индекс является действительным в отладчике или с 'Println()'. Пройдите и посмотрите значения. Oh BTW, эта строка и ** точное полное сообщение об ошибке. – zaph

+0

Спасибо, действительно, это была ошибка индекса, но сообщение об ошибке не указало индекс массива вне диапазона, но Thread 1: EXC_BAD_INSTRUCTION on line let retCard = cards [idx] – zvweiss

ответ

0

Я бы поспорил, что, несмотря на сообщение об ошибке, на самом деле вы видите ошибки переполнения целых чисел. Попробуйте использовать вместо arc4random_uniform():

let idx = Int(arc4random_uniform(UInt32(cards.count))) 
+0

Хотя 'arc4random_uniform()' лучший выбор, я скорее сомневаюсь это ошибка переполнения, если значение 'cards.count' довольно странно, и в этом случае это проблема. – zaph

+0

BTW, предлагаемый код не будет компилироваться. Ошибка: «Int» не конвертируется в «UInt32». Правильный код: 'let idx = Int (arc4random_uniform (UInt32 (cards.count)))' – zaph

+0

Спасибо, действительно, это помогло. – zvweiss