遇到:在解开一个Optional值时意外发现nil,当我尝试使它成为可选时,我得到另一个错误

时间:2017-12-05 08:56:13

标签: ios swift sprite-kit

我在尝试farmTile可选时遇到此错误:可选类型Bool?而不是unwrapped;的值您的意思是使用'!'或者'?'?

一小时前工作正常。

var farmTile:SKSpriteNode!

func createFarmTile(){

    farmTile = SKSpriteNode(imageNamed: "farmtile.png")
    farmTile?.size = CGSize(width: 185, height: 195)
    farmTile?.position = CGPoint(x: -95, y: 150)
    self.addChild(farmTile!)
    farmTile?.name = "farmTile"
    farmTile.zPosition = 1

   if farmTile?.contains(touchLocation){
       print("test")
   }
}

2 个答案:

答案 0 :(得分:2)

farmTile?.contains(touchLocation)返回一个可选的Bool。您应该正确处理可选项。做这样的事......

var farmTile: SKSpriteNode? // optional

func createFarmTile(){

    guard let farmTile = SKSpriteNode(imageNamed: "farmtile.png")
    else { /* do what you need to do if it is missing */ ; return }

    farmTile.size = CGSize(width: 185, height: 195)
    farmTile.position = CGPoint(x: -95, y: 150)
    self.addChild(farmTile)
    farmTile.name = "farmTile"
    farmTile.zPosition = 1
    self.farmTile = farmTile

    if farmTile.contains(touchLocation){
       print("test")
    }
}

答案 1 :(得分:1)

您收到此错误的原因是Unexpectedly found nil while unwrapping an Optional value,原因是您的nil内容不应为nil。在您的情况下,您的farmtilenil,但您使用的是SKSpriteNode!,在使用此变量时,这意味着最好不是nil

您设置farmtile的唯一一点是在farmTile = SKSpriteNode(imageNamed: "farmtile.png")这一行,这意味着您的图片文件存在问题,因为SKSpriteNode将返回nil。我建议您检查以确保在资产中正确设置了图像文件,它的名称是正确的,并且它已捆绑到您的二进制文件中。如果我知道你如何设置你的资产,我可以在这里进一步提供帮助。

解决此问题后,您面临另一个问题。 (我假设这将是一个不同的功能)

if farmTile?.contains(touchLocation){
    print("test")
}

这是您收到第二个错误的地方:optional: Value of optional type Bool? not unwrapped; did you mean to use '!' or '?'?

您是在编译时而不是运行时收到此错误,因为您添加了?到你的farmTile认为它会解决你的问题,而不是。

现在,您可以正确处理您的选项。

您可以使用guard语句来验证是否正在创建sprite,并将更有意义的消息传递给您自己,以便您知道将来问题的位置。

var farmTile:SKSpriteNode!

func createFarmTile(){

    guard let farmTile = SKSpriteNode(imageNamed: "farmtile.png") else { //insert your error handling here}
    farmTile.size = CGSize(width: 185, height: 195)
    farmTile.position = CGPoint(x: -95, y: 150)
    farmTile.name = "farmTile"
    farmTile.zPosition = 1
    self.farmTile = farmTile
    self.addChild(farmTile)
}

此时我们设计它以便farmTile必须存在(基本上通过确保调用createFarmTile函数的100%),所以没有理由添加额外的unwrap,所以采取问号。

//Inside the touch begins function
if farmTile.contains(touchLocation){
    print("test")
}