在声明的函数之外使用变量时意外发现nil

时间:2018-11-05 00:55:12

标签: swift

我正在尝试制作一种数学游戏,当敌人被枪杀时,系统会提示用户一个数学问题,所以我做到了,所以当敌人被枪击时,会弹出一个带有数字的键盘,用户可以在其中输入答案。但是只要键盘弹出,我都会收到错误消息:

  

线程1:致命错误:在展开可选值时意外发现nil

在代码的顶部,我声明了我正在使用的变量:

var button1:SKLabelNode?
var answerDisplay:SKLabelNode!

这是在敌人被击中时运行的功能:

func runMathsProblem(){
    //This is the label that is meant to display what the user enters

    let answerDisplay = SKLabelNode(fontNamed: "Bulky Pixels")
    answerDisplay.name = "AnswerDisplay"
    answerDisplay.text = "= "
    answerDisplay.fontSize = 110
    answerDisplay.fontColor = SKColor.white
    answerDisplay.horizontalAlignmentMode = SKLabelHorizontalAlignmentMode.left
    answerDisplay.zPosition = 110
    answerDisplay.position = CGPoint(x: self.size.width * 0.38, y: self.size.height * 0.63)
    self.addChild(answerDisplay)

    //This is the button the user presses to type "1" on screen

    let button1 = SKLabelNode(fontNamed: "Bulky Pixels")
    button1.name = "Button1"
    button1.text = "1"
    button1.fontSize = 110
    button1.fontColor = SKColor.white
    button1.zPosition = 120
    button1.position = CGPoint(x: self.size.width * 0.3, y: self.size.height * 0.32)
    self.addChild(button1)
}

这是检测用户是否按下按钮的地方,目的是将按下的数字添加到变量answerDisplay中以显示在屏幕上(这也是我得到错误的地方):

 override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
    for touch: AnyObject in touches{
        let pointOfTouch = touch.location(in: self)

        if button1!.contains(pointOfTouch){  **//This is where I get the error**
            answerDisplay!.text = answerDisplay.text! + "1"
        }
    }
}

我认为这与声明变量的方式有关

1 个答案:

答案 0 :(得分:0)

  

在代码顶部,我声明了我正在使用的变量

但是您永远不会最终使用它们,因为...

let answerDisplay = SKLabelNode(fontNamed: "Bulky Pixels")
.
.
.
let button1 = SKLabelNode(fontNamed: "Bulky Pixels")
.
.
.

这将创建SKLabelNode新实例,而不使用您已经创建的实例。因此,您需要做的是删除关键字let,以便编译器理解您引用的是已经声明的变量。