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

4

我是新手程序员,正在尝试用Swift编写井字棋应用程序。这个错误阻止了我运行应用程序:property 'self.circle1' not initialized at super.init call。

应用程序还没有完成,但我不知道现有代码中的错误在哪里。请详细解释任何建议,因为我再次是初学者。谢谢! 我的代码:

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


}

2
为什么你在那里使用 strong 关键字?如果你移除 strong,你的错误就会消失。或者,如果你要让它们变成 strong,你必须在你的 init 方法中初始化它们。 - Rob
1
规则1:IBOutlet 总是使用 weak 关键字。 - holex
即使我删除了“strong”,我仍然有错误。 - user3724215
在IB中,所有的IBOutlet都连接好了吗? - Rob
@Rob "strong"这个关键词是因为当你将一个storyboard对象与UIViewController连接时,Xcode会自动添加它。如果你删除"strong"关键词,它应该会消除初始化警告。 - sketchyTech
...但是如果您需要保持强连接(保持 strong 关键字?),那么您应该能够编写例如 @IBOutlet strong var circle1: UIImageView? - 这是目前最佳实践,我不确定。 - sketchyTech
4个回答

3
只需在声明末尾添加问号或感叹号即可:
@IBOutlet strong var circle1: UIImageView?

使用Swift编程时,每个变量在调用super.init之前都必须进行初始化。在这种情况下,变量直到Storyboard或nib加载后才会被初始化,而这将在调用类init方法之后发生。

您的circle1变量的类型除了是UIImageView外,还将是Optional,因此需要在其声明中指示。因此,您需要使用问号或感叹号解包变量以访问其值。

let prax = circle1?.image

或者

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

2

你的类中声明了可选变量,但是这些变量没有被初始化。在调用super.init()之前,必须对这些变量进行初始化。

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

可选变量不需要在init中声明。此外,他的变量被定义为IBOutlets,我想他希望它们在Nib中连接。 - drewag
它还要求在required init?(coder aDecoder: NSCoder)中进行初始化吗? - Abdul Yasin
@AbdulYasin 这是“正常的”。除非您正在解码/编码对象,否则可以将其作为致命错误留下。但是,我建议您花时间实现它,如果以前没有,请参考NSCoding指南:https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/Archiving/Articles/codingobjects.html - jakenberg

2

这行代码中的@IBOutlet

@IBOutlet strong var circle1: UIImageView

这段文字表明UIImageView的circle1(以及所有其他的UIImageViews)都被放置在storyboard或xib文件中。storyboard需要将其中定义的元素与ViewController代码中的对象(即circle1变量)进行连接。

要进行此连接,请打开storyboard,打开assistant editor(xcode右上角有三个按钮,第二个是assistant editor)。现在你应该获得两个并排的编辑器。一个打开storyboard,另一个打开你的ViewController文件。然后使用鼠标从storyboard中的UIImageView向ViewController中的circle1变量进行Ctrl-Drag拖拽。对于每个元素重复此操作,错误应该就会消失。


1
我一开始就做了那个,现在我又做了一遍,但还是出现了错误。 - user3724215

0

对于更新版本的Swift,UIButtonClicked函数应该像这样...

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

希望这能帮到你!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接