设置委托会导致崩溃,将其保留为 null 则不会
Setting delegate results in crash, leaving it null doesn't
我正在尝试做一些不寻常的事情 curiosity/masochism。
有一个名为 Swiftris 的教程。它基于 Swift 2,但我坚持 Swift 1 使用 Xcode 6。我不能使用调试器,因为它需要我有权访问的一台机器上的管理员权限.所以我在我的视图控制器中放置了一个文本标签来显示调试信息。
所以,是的,这已经是我正在尝试做的一件奇怪的事情了。但是我真的很想学这些东西。
这是我的代码。有两个相关文件,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可以间接与我的错误标签对话。
如果我不设置它,错误标签没有更新,但也没有崩溃,可能是因为该类型是可选的。如果我做设置,它会崩溃,抱怨,"fatal error: unexpectedly found nil while unwrapping an Optional value"。这东西怎么可能是零?
您必须在设置委托之前初始化 swiftris:
override init() {
super.init()
swiftris = Swiftris()
swiftris.delegate = self
}
我正在尝试做一些不寻常的事情 curiosity/masochism。
有一个名为 Swiftris 的教程。它基于 Swift 2,但我坚持 Swift 1 使用 Xcode 6。我不能使用调试器,因为它需要我有权访问的一台机器上的管理员权限.所以我在我的视图控制器中放置了一个文本标签来显示调试信息。
所以,是的,这已经是我正在尝试做的一件奇怪的事情了。但是我真的很想学这些东西。
这是我的代码。有两个相关文件,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可以间接与我的错误标签对话。
如果我不设置它,错误标签没有更新,但也没有崩溃,可能是因为该类型是可选的。如果我做设置,它会崩溃,抱怨,"fatal error: unexpectedly found nil while unwrapping an Optional value"。这东西怎么可能是零?
您必须在设置委托之前初始化 swiftris:
override init() {
super.init()
swiftris = Swiftris()
swiftris.delegate = self
}