我在尝试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")
}
}
答案 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
。在您的情况下,您的farmtile
为nil
,但您使用的是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")
}