2017-02-24 62 views
0

我正在做一个井字棋项目,但它不工作。我收到的问题是let space = sender.tag。当我点击一个tic tac toe盒来测试它时,会发生什么情况,它会给我“exc_bad_inst”。谁能帮我?运行我的iOS应用时出现EXC_BAD_INST错误

import UIKit 

class ViewController: UIViewController { 
    @IBOutlet weak var buttonOne: UIButton! 
    @IBOutlet weak var buttonTwo: UIButton! 
    @IBOutlet weak var buttonThree: UIButton! 
    @IBOutlet weak var buttonFour: UIButton! 
    @IBOutlet weak var buttonFive: UIButton! 
    @IBOutlet weak var buttonSix: UIButton! 
    @IBOutlet weak var buttonSeven: UIButton! 
    @IBOutlet weak var buttonEight: UIButton! 
    @IBOutlet weak var buttonNine: UIButton! 

    @IBOutlet weak var gameResult: UILabel! 

    var gameState = ["","","", 
        "","","", 
        "","","" 
        ] 

    let winningCombos = [[0, 1, 2], [3, 4, 5], [6, 7, 8], //horizontal 
         [0, 3, 6], [1, 4, 7], [2, 5, 8], //vertical 
         [0, 4, 8], [2, 4, 6]] //diagonals 

    var gameOver = false 
    var turnCount = 0 
    var currentPlayer: String! 

    func pickFirstPlayer() -> String { 
     if arc4random_uniform(2) == 0 { 
      currentPlayer = "o" 
     } else { 
      currentPlayer = "x" 
     } 
     return currentPlayer 
    } 

    func toggleNextPlayer() { 
     if currentPlayer == "o" { 
      currentPlayer = "x" 
     } else { 
      currentPlayer = "o" 
     } 
    } 

    @IBAction func makeMove(sender: AnyObject) { 
     let space = sender.tag 
     if (gameState[space] == "" && gameOver == false) { 
      let turnImage = UIImage(named: "\(self.currentPlayer).png") 
      sender.setImage(turnImage!, forState: .Normal) 
      gameState[space] = self.currentPlayer 
      self.toggleNextPlayer() 
      self.turnCount++ 
      self.checkForWinner() 
     } 
    } 

    func checkForWinner() { 
     var winner = "" 
     for combo in winningCombos { 
      var row: [String] = [] 
      for space in combo { 
       row.append(gameState[space]) 
      } 
      if (row[0] == row[1] && row[1] == row[2] && row[0] != "") { 
       gameOver = true 
       winner = row[0].uppercaseString 
       gameResult.text = "\(winner) is the winner!" 

      } 
     } 
     if (turnCount == 9 && winner == "") { 
      gameResult.text = "It's a tie!" 
      gameOver = true 
     } 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     pickFirstPlayer() 
    } 
} 

回答

-1

这不应该编译。您已将您的操作设置为使用sender: AnyObject的参数。

试着改变你的sender参数的类型UIButton

@IBAction func makeMove(sender: UIButton) { 

然后编译器会知道发件人包含一个按钮,在按钮有一个标签属性。

你是如何调用你的makeMove方法的?

+0

感谢您的信息,去在那 –

0

,而不是改变FUNC定义,要使用if letsenderUIButton:尽快

@IBAction func makeMove(sender: AnyObject) { 
    if let btn = sender as? UIButton { 
     let space = btn.tag 
     if (gameState[space] == "" && gameOver == false) { 
      let turnImage = UIImage(named: "\(self.currentPlayer).png") 
      sender.setImage(turnImage!, forState: .Normal) 
      gameState[space] = self.currentPlayer 
      self.toggleNextPlayer() 
      self.turnCount++ 
      self.checkForWinner() 
     } 
    } else { 
     // something else called this function 
    } 
} 
相关问题