1

I'm new to programming and am getting this error in my Tic-tac-toe game: property self.circle1 not initialized at super.init call.

I've already control-dragged and connected my UIImages and buttons and all that and I've also tried taking the strong out of those statements (to make the outlet weak) and I'm still not able to run my app. What's going on? My code:

import UIKit

class ViewController: UIViewController {

//Initializing all imgs as variables:


@IBOutlet strong var circle1: UIImageView
@IBOutlet strong var circle2: UIImageView
@IBOutlet strong var circle3: UIImageView
@IBOutlet strong var circle4: UIImageView
@IBOutlet strong var circle5: UIImageView
@IBOutlet strong var circle6: UIImageView
@IBOutlet strong var circle7: UIImageView
@IBOutlet strong var circle8: UIImageView
@IBOutlet strong var circle9: UIImageView

@IBOutlet strong var circleBtn1: UIButton
@IBOutlet strong var circleBtn2: UIButton
@IBOutlet strong var circleBtn3: UIButton
@IBOutlet strong var circleBtn4: UIButton
@IBOutlet strong var circleBtn5: UIButton
@IBOutlet strong var circleBtn6: UIButton
@IBOutlet strong var circleBtn7: UIButton
@IBOutlet strong var circleBtn8: UIButton
@IBOutlet strong var circleBtn9: UIButton

@IBOutlet strong var resetBtn: UIButton
@IBOutlet strong var ResultsLabel: UILabel

//Creating variables:

var plays = Dictionary<Int,Int>()
var done = false
var aiDeciding = false

//Function that says what to do if a UIButton is clicked:

@IBAction func UIbuttonClicked(sender:UIButton) {
    ResultsLabel.hidden = true
    if !plays[sender.tag] && !aiDeciding && !done {
    setImgforCircle(sender.tag, player:1)

    }

//Executing these functions:

    checkforWin()
    aiTurn()

}

//Function that says sets an X or O in the proper circle depending on player:

func setImgforCircle(spot:Int, player:Int) {
    var playerMark = player == 1 ? "x" : "o"
    plays[spot] = player
    switch spot {
    case 1:
        circle1.image = UIImage(named: playerMark)
    case 2:
        circle2.image = UIImage(named: playerMark)
    case 3:
        circle3.image = UIImage(named: playerMark)
    case 4:
        circle4.image = UIImage(named: playerMark)
    case 5:
        circle5.image = UIImage(named: playerMark)
    case 6:
        circle6.image = UIImage(named: playerMark)
    case 7:
        circle7.image = UIImage(named: playerMark)
    case 8:
        circle8.image = UIImage(named: playerMark)
    case 9:
        circle9.image = UIImage(named: playerMark)

    default:
        circle2.image = UIImage(named: playerMark)
    }

}

//Function that sees if certain paths of circles have the same mark

func checkforWin() {
var whoWon = ["Lost":0, "Won":1]
    for (key,value) in whoWon {
        if ((plays[1] == value && plays[2] == value && plays[3] == value) || //across top row
        (plays[4] == value && plays[5] == value && plays[6] == value) || //across middle row
        (plays[7] == value && plays[8] == value && plays[9] == value) || //across bottom row
        (plays[1] == value && plays[4] == value && plays[7] == value) || //down left column
        (plays[2] == value && plays[5] == value && plays[8] == value) || //down middle column
        (plays[3] == value && plays[6] == value && plays[9] == value) || //down right column
        (plays[1] == value && plays[5] == value && plays[9] == value) || //diagonal going right
        (plays[7] == value && plays[5] == value && plays[3] == value)) { //diagonal going left

            ResultsLabel.hidden = false
            ResultsLabel.text = "You \(key)!"
        }

    }

}
func aiTurn() {

}


override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}
}
twlkyao
  • 14,302
  • 7
  • 27
  • 44
  • Definitely take the `strong`s out -- views are strongly held by their superview, so you want those vars to be weakly held by your view controller. You still get that same error without the `strong` declarations? – Nate Cook Jun 25 '14 at 00:40
  • Not possible... definitely, same user, same question – David Berry Jun 25 '14 at 06:01
  • Sorry, yes, by taking the "strong"s out the error is gone but I now get this message in a green bar at the top of my list of outlets: "Thread 1: breakpoint 1.4" when I try to run my app the simulator is just black. –  Jun 26 '14 at 00:58

1 Answers1

2

First, there's no reason to have all those strongs. Delete them. All.

Then, you should probably make all those optional if you don't want to initialize them in your init() method. So take a line like this:

@IBOutlet strong var circle1: UIImageView

And change it into this:

@IBOutlet var circle1: UIImageView!

More information on the exclamation mark in Swift.

Community
  • 1
  • 1
Undo
  • 25,519
  • 37
  • 106
  • 129