设置委托结果发生崩溃,将其保留为空不会
问题描述:
我试图通过纯粹的好奇心/受虐狂行为来做一些不寻常的事情。设置委托结果发生崩溃,将其保留为空不会
有一个教程叫做。它基于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可以间接地跟我错误标签。
如果我不要设置它,没有更新错误标签,但也没有崩溃,可能是因为该类型是可选的。如果我做设置,它崩溃,抱怨,“致命的错误:意外地发现零,同时解开可选值”。这件事怎么会是零?
答
你必须设置委托前初始化swiftris:
override init() {
super.init()
swiftris = Swiftris()
swiftris.delegate = self
}
初始化swiftris - > VAR swiftris:Swiftris! = Swiftris()并委托它 - >覆盖初始化() –
原来我修剪了一些重要的代码。我在viewDidLoad中实例化了Swiftris。所以我想这个问题试图在init函数中设置swiftris.delegate,因为这发生在viewDidLoad之前。 (我从其他语言和平台的经验中知道这些担忧,但不同的是,不同的环境让我不确定在哪里寻找,可能是因为我知道我不知道我不知道什么,一个令人望而生畏的检查数量。) – MackTuesday
当你声明var时,在setd委托在viewdidload –