swift - 设置委托(delegate)会导致崩溃,将其保留为空则不会

标签 swift swift2 xcode6

出于纯粹的好奇心/受虐狂,我正在尝试做一些不寻常的事情。

有一个名为 Swiftris 的教程。它基于 Swift 2,但我坚持使用 Xcode 6 的 Swift 1。我无法使用调试器,因为它需要我有权访问的一台计算机上的管理员权限。因此,我在 View Controller 中放置了一个文本标签来显示调试信息。

所以,是的,这已经是我正在尝试做的一件奇怪的事情了。但我真的很想学这些东西。

这是我的代码。有两个相关文件: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 中,我有一个用于发送调试字符串的委托(delegate),在 GameViewController 中,我将 Swiftris 的委托(delegate)设置为我自己,以便 Swiftris 可以间接与我的错误标签对话。

如果我设置它,则错误标签不会更新,但也不会崩溃,可能是因为该类型是可选的。如果我设置,它会崩溃,并提示“ fatal error :在展开可选值时意外发现 nil”。这东西怎么可以为零呢?

最佳答案

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

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

关于swift - 设置委托(delegate)会导致崩溃,将其保留为空则不会,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37190540/

相关文章:

ios - 为什么从库中获取照片时 imagePickerController 会崩溃,但从相机中获取照片却可以正常工作

iphone - xcode 6 上的启动屏幕 - ios 8

ios - 未生成适用于 iOS 的 Xcode 6.1 静态库 .a

ios - 打印说明在 Xcode 6 中不起作用

function - 在 Swift 2.0 中使用 reduce() 时出错

ios - 如何使用自动布局设置按钮宽度并针对 iPhone 6 plus 进行调整?

ios - 使用 Swift 更新 Firebase 中的子值

ios - 允许 JSQMessagesViewController 中使用更长的用户名

ios - 如何快速设置每周本地通知

ios - 如何将 ImageSliderViewController 转换为 Swift 2