Swift中的错误:属性'self.circle1'在super.init调用时未初始化?

我是编程新手,正在尝试在Swift中编写井字游戏应用程序,而这个错误阻止了我运行app:在super.init调用时没有初始化的属性“self.circle1”。

该应用程序还没有完成,但我看不到现有的代码中的错误。 请再次解释任何build议,因为我再次成为BEGINNER。 谢谢! 我的代码:

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

在声明的最后添加一个问号或一个感叹号:

 @IBOutlet strong var circle1: UIImageView? 

使用Swift,在调用super.init之前,每个variables都必须被初始化。 在这种情况下,variables不会被初始化,直到Storyboard或者nib被加载,并且在你的类的init方法被调用之后。

你的circle1variables的types; 除了是一个UIImageView; 将是一个可选项,所以需要在声明中注明。 因此,您需要打开variables才能使用问号或感叹号来访问它的值。

 let prax = circle1?.image 

要么

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

(Xcode6 Beta-4似乎解决了这个问题,并在代码编辑器中自动提供“点击修复”错误button。)

你缺less在你的类中声明的可选variables的初始化,在调用super.init()之前,

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

在这行中的@IBOutlet

 @IBOutlet strong var circle1: UIImageView 

暗示UIImageView circle1(以及所有其他的UIImageViews )被放置在故事板或xib文件中。 故事板需要从定义的元素与ViewController代码中的对象(circle1 var)build立连接。

为了使这个连接打开故事板,打开助理编辑器(xcode右上angular有三个button,第二个是助理编辑器)。 你现在应该得到两个编辑彼此相邻。 在一个有故事板打开,在另一个你的ViewController文件。 现在,用鼠标从故事板中的UIImageView拖动到ViewController中的circle1variables。 重复每个元素,错误应该消失。

UIButtonClicked函数应该看起来像这样的更新版本的SWIFT …

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

希望这可以帮助!