2016-05-12 23 views
0

Ich versuche, etwas Ungewöhnliches aus reiner Neugier/Masochismus zu tun.Einstellen der Delegierten Ergebnisse in Absturz, so dass es null nicht

Es gibt ein Tutorial namens . Es basiert auf Swift 2, aber ich bin mit Swift 1 mit Xcode 6 festgefahren. Ich kann den Debugger nicht verwenden, weil er Administratorrechte auf dem einen Rechner benötigt, auf den ich Zugriff habe. Also habe ich in meinem View-Controller eine Textbeschriftung zum Anzeigen von Debug-Informationen angebracht.

Also ja, schon ist das eine seltsame Sache, die ich versuche zu tun. Aber ich möchte wirklich dieses Zeug lernen.

Also hier ist mein Code. Es gibt zwei relevante Dateien, GameController.swift und 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 
    } 
} 

und

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 
} 

Wie Sie sehen können, in Swiftris habe ich einen Delegaten, der für das Senden von Debug-Strings ist, und in GameViewController stelle ich Swiftris Delegierter ich selbst zu sein, so Swiftris indirekt reden kann meine Fehlerbezeichnung

Wenn ich nicht setze es, gibt es keine Aktualisierung der Fehlerbezeichnung, aber es gibt auch keinen Absturz, wahrscheinlich, weil dieser Typ optional ist. Wenn ich setze setze, stürzt es ab, beschweren sich, "fataler Fehler: unerwartet fand Null beim Entpacken eines optionalen Wertes". Wie kann dieses Ding null sein?

+1

Init swiftris -> var swiftris: Swiftris! = Swiftris() und delegiere es in -> override init() –

+0

Es stellte sich heraus, dass ich einige wichtigen Code getrimmt hatte. Ich instanziiere Swiftris in viewDidLoad. Ich vermute also, das Problem war, in der init-Funktion swiftris.delegate zu setzen, weil das vor viewDidLoad passiert. (Ich bin mir dieser Bedenken durch meine Erfahrung mit anderen Sprachen und Plattformen bewusst, aber irgendwie hat mich die andere Umgebung unsicher, wo ich suchen sollte, wahrscheinlich weil ich weiß, dass ich nicht weiß, was ich nicht weiß, und das lässt offen eine gewaltige Menge an Möglichkeiten zu überprüfen.) – MackTuesday

+1

Init, wenn Sie die Variable deklarieren, nach dem Delegate in Viewdidload –

Antwort

1

Sie haben swiftris zu initialisieren, bevor der Delegat Einstellung:

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