Swift SpriteKit:线程1:信号SIGABRT。无法转换SKLabelNode类型的值?

时间:2015-09-04 23:13:33

标签: swift sprite-kit sigabrt

所以我正在完成一个项目,当我运行它并且它崩溃了,我得到了线程1:信号SIGABRT错误,我看了描述,它给了我这个:

无法将'SKLabelNode'(0x108ed0b78)类型的值转换为'Koala_Hop.MCTPointLabel'(0x108091da0)。 (lldb)

这段代码:

func loadHighscore() {
    let defaults = NSUserDefaults.standardUserDefaults()
    let highscoreLabel = childNodeWithName("highscoreLabel") as! MCTPointLabel //line with error
    highscoreLabel.setTo(defaults.integerForKey("highscore"))

真的很困惑,需要帮助解决这个问题!提前谢谢!

    **EDIT**: The declaration of highscoreLabel:
      func addPoints() {
    let pointsLabel = MCTPointLabel(num: 0)
    pointsLabel.fontColor = UIColor.brownColor()
    pointsLabel.position = CGPointMake(30.0, view!.frame.size.height - 40)
    pointsLabel.name = "pointsLabel"
    addChild(pointsLabel)


    let highScoreLabels = MCTPointLabel(num: 0)
    highScoreLabels.position = CGPointMake(view!.frame.size.width - 40, view!.frame.size.height - 40)
    addChild(highScoreLabels)

    let highscoreLabel = SKLabelNode(text: "High Score")
    highscoreLabel.fontColor = UIColor.brownColor()
    highscoreLabel.fontSize = 16.0
    highscoreLabel.fontName = "Chalkduster"
    highscoreLabel.name = "highscoreLabel"
    highscoreLabel.position = CGPointMake(620, 310)
    addChild(highscoreLabel)

   }

2 个答案:

答案 0 :(得分:0)

显然childNodeWithName("highscoreLabel")不是MCTPointLable。

强制转换(使用!)通常是可以避免的,并且可能会导致运行时问题。您需要确定childNodeWithName("highscoreLabel")的可能结果,并确保您处理所有可能性或找到您需要的其他方式。

答案 1 :(得分:0)

在GameScene内部更改高分标签的声明:

let highscoreLabel = MCTPointsLabel(text: "High Score")

假设MCTPointsLabel继承自SKLabelNode,一切都会正常工作。你必须确保如果你强制类型转换一个你真正拥有的类实际上有一个该类的对象。当你这样说:

let highscoreLabel = childNodeWithName("highscoreLabel") as! MCTPointLabel

您将标签类型转换为MCTPointLabel,但由于之前的highscoreLabel实际上已声明为SKLabelNode,因此您无法进行类型转换并收到错误。

希望这有帮助,如果您需要澄清,请告诉我。
修改:改为尝试:

var highscoreLabel = MCTPointsLabel(num: 0)
highscoreLabel.text = "High Score"