设置委托结果发生崩溃,将其保留为空不会

问题描述:

我试图通过纯粹的好奇心/受虐狂行为来做一些不寻常的事情。设置委托结果发生崩溃,将其保留为空不会

有一个教程叫做。它基于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可以间接地跟我错误标签。

如果我不要设置它,没有更新错误标签,但也没有崩溃,可能是因为该类型是可选的。如果我设置,它崩溃,抱怨,“致命的错误:意外地发现零,同时解开可选值”。这件事怎么会是零?

+1

初始化swiftris - > VAR swiftris:Swiftris! = Swiftris()并委托它 - >覆盖初始化() –

+0

原来我修剪了一些重要的代码。我在viewDidLoad中实例化了Swiftris。所以我想这个问题试图在init函数中设置swiftris.delegate,因为这发生在viewDidLoad之前。 (我从其他语言和平台的经验中知道这些担忧,但不同的是,不同的环境让我不确定在哪里寻找,可能是因为我知道我不知道我不知道什么,一个令人望而生畏的检查数量。) – MackTuesday

+1

当你声明var时,在setd委托在viewdidload –

你必须设置委托前初始化swiftris:

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