设置委托导致崩溃,将其保留为null不会

时间:2016-05-12 14:53:08

标签: swift swift2 xcode6

我试图通过纯粹的好奇心/受虐狂来做一些与众不同的事。

有一个名为Swiftris的教程。它基于Swift 2,但是我使用Xcode 6坚持使用Swift 1.我不能使用调试器,因为它需要我可以访问的一台机器的管理员权限。因此,我在视图控制器中放置了一个文本标签,用于显示调试信息。

所以是的,这已经是我想做的奇怪的事了。但我真的想学习这些东西。

所以这是我的代码。有两个相关的文件,GameController.swift和Swiftris.swift。

class GameViewController: UIViewController, SwiftrisDelegate {

    var scene: GameScene!
    var swiftris: Swiftris!

    var panPointReference:CGPoint?

    @IBOutlet weak var errorLabel: UILabel!

    override init() {
        super.init()
        //swiftris.delegate = self
    }

    required init(coder aDecoder: NSCoder) {
        //fatalError("init(coder:) has not been implemented")
        super.init(coder: aDecoder)
        swiftris.delegate? = self
    }

    // Leaving out the delegate functions here. I do implement them,
    // I'm just not showing them, and they don't seem to affect the
    // error. I've checked.

    func updateErrorLabel(s: String) {
        errorLabel.text = s
    }
}

protocol SwiftrisDelegate {
    func gameDidEnd(swiftris: Swiftris)
    func gameDidBegin(swiftris: Swiftris)
    func gameShapeDidLand(swiftris: Swiftris)
    func gameShapeDidMove(swiftris: Swiftris)
    func gameShapeDidDrop(swiftris: Swiftris)
    func gameDidLevelUp(swiftris: Swiftris)
    func updateErrorLabel(s: String)
}

class Swiftris {
    var blockArray:Array2D<Block>
    var nextShape:Shape?
    var fallingShape:Shape?
    var delegate:SwiftrisDelegate?

    var score = 0;
    var level = 1;

    init() {
        fallingShape = nil
        nextShape = nil
        blockArray = Array2D<Block>(columns: NumColumns, rows: NumRows)
        delegate?.updateErrorLabel("init")
    }

    func beginGame() {
        delegate?.updateErrorLabel("game beginning")
        if (nextShape == nil) {
            nextShape = Shape.random(PreviewColumn, startingRow: PreviewRow)
        }
        delegate?.gameDidBegin(self)
    }

    // Bunch of stuff excluded here that doesn't seem to matter
}

正如您所看到的,在Swiftris中我有一个用于发送调试字符串的委托,而在GameViewController中,我将Swiftris的委托设置为我自己,以便Swiftris可以间接与我的错误标签对话。

如果我没有设置它,则不会更新错误标签,但也没有崩溃,可能是因为该类型是可选的。如果我执行设置,则会崩溃,抱怨,并且会发生致命错误:在展开“可选”值时会意外地发现nil&#34;。这件事怎么可能是零?

1 个答案:

答案 0 :(得分:1)

您必须在设置委托之前初始化swiftris:

override init() {
        super.init()
        swiftris = Swiftris()
        swiftris.delegate = self
    }