Error en Swift: la propiedad 'self.circle1' no se inicializó en la llamada super.init?

Soy nuevo en progtwigción y estoy tratando de escribir una aplicación tic-tac-toe en Swift, y este error me impide ejecutar la aplicación: la propiedad 'self.circle1' no se inicializó en la llamada super.init.

La aplicación aún no está terminada, pero no veo dónde está el error en el código existente. Por favor, explique cualquier sugerencia a background ya que una vez más soy un PRINCIPIANTE. ¡Gracias! Mi código:

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

Simplemente agregue un signo de interrogación o un signo de exclamación al final de la statement:

 @IBOutlet strong var circle1: UIImageView? 

Con Swift, cada variable debe inicializarse antes de llamar a super.init. En este caso, la variable no se inicializará hasta que se cargue Storyboard o nib, y eso será posterior a la llamada al método init de su class.

El tipo de su variable circle1; además de ser un UIImageView; será opcional, por lo que debe indicarlo en su statement. En consecuencia, necesitará desenvolver la variable para acceder a su valor con el signo de interrogación o el signo de exclamación.

 let prax = circle1?.image 

o

 if circle1 { // now you're sure the object exists let prax = circle1!.image } 

(Xcode6 Beta-4 parece haber resuelto esto, y automáticamente da botones de error "haga clic para corregir" en el editor de códigos).

Le falta la initialization de las variables opcionales declaradas en su class, lo que debe hacerse antes de llamar a super.init()

 init(nibName nibNameOrNil: String!, bundle nibBundleOrNil: NSBundle!) { self.circle1 = UIImageView() super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) } 

El @IBOutlet en esta línea

 @IBOutlet strong var circle1: UIImageView 

insinúa que UIImageView circle1 (y todas las demás UIImageViews ) se colocan en un storyboard o file xib. El storyboard necesita hacer una connection desde los elementos definidos allí a los objects en su código ViewController (el círculo1 var).

Para que esta connection abra el guión gráfico, abra el editor asistente (tiene tres botones en la parte superior derecha de xcode, el segundo es el editor asistente). Ahora debería get dos editores uno al lado del otro. En uno tiene el storyboard abierto, en el otro el file ViewController. Ahora Ctrl-Arrastre con el mouse desde su UIImageView en el guión gráfico a la variable circle1 en el ViewController. Repita para cada elemento y el error debería desaparecer.

La function UIButtonClicked debería verse así para las versiones actualizadas de swift …

  @IBAction func UIButtonClicked(sender:UIButton) { ticTacLabel.hidden = true if plays[sender.tag] == nil && !aiDeciding && !done { setImageForSpot(sender.tag, player:1) } 

¡Espero que esto ayude!