Swift中的错误:属性'self.circle1'在super.init调用时没有初始化? [英] Error in Swift: property 'self.circle1' not initialized at super.init call?

查看:401
本文介绍了Swift中的错误:属性'self.circle1'在super.init调用时没有初始化?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am new to programming and am trying to write a tic-tac-toe app in Swift, and this error is preventing me from running the app: property 'self.circle1' not initialized at super.init call.

该应用程序尚未完成,但我没有看到现有代码中的错误位置。请再次详细解释我的建议,我是一个初学者。谢谢!
我的代码:

The app is not finished yet but I don't see where the error is in the existing code. Please explain any suggestions thoroughly as once again I am a BEGINNER. Thanks! 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 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.
    }


}


推荐答案

只需在声明末尾添加问号或感叹号:

Just add a question mark or an exclamation mark at the end of the declaration:

@IBOutlet strong var circle1: UIImageView?

使用Swift,必须在调用super.init之前初始化每个变量。在这种情况下,在加载Storyboard或nib之前,不会初始化变量,并且这将在调用类init方法之后进行初始化。

With Swift, every variable has to be initialized before calling super.init. In this case, the variable won't be initialized until the Storyboard or nib is loaded, and that will be after your class init method is called.

你的类型circle1变量;除了是一个UIImageView;将是一个可选项,因此需要在其声明中指明。因此,您需要打开变量以使用问号或感叹号访问其值。

The type of your circle1 variable; in addition to being a UIImageView; will be an Optional, so it needs to indicate that in its declaration. Consequently, you'll need to unwrap the variable to access it's value with either the question mark or the exclamation mark.

let prax = circle1?.image

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

(Xcode6 Beta- 4似乎解决了这个问题,并在代码编辑器中自动给出单击修复错误按钮。)

这篇关于Swift中的错误:属性'self.circle1'在super.init调用时没有初始化?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆