【问题标题】:iOs9 Swift spritekit,SKEmitterNode fatal error: "unexpectedly found nil while unwrapping an Optional value "iOs9 Swift spritekit,SKEmitterNode 致命错误:“在展开可选值时意外发现 nil”
【发布时间】:2015-09-17 09:39:01
【问题描述】:

在这段代码上工作了几个小时没有成功,请指教:

我正在构建一个 ios 9 spritekit 游戏。这个方法:

func createFiringParticles(location:CGPoint, force:CGVector){

    let fireEmitter = SKEmitterNode(fileNamed: "FireParticles")

    fireEmitter!.position = location
    fireEmitter!.name = "fireEmitter"
    fireEmitter!.zPosition = 1
    fireEmitter!.targetNode = self
    fireEmitter!.numParticlesToEmit = 50

    fireEmitter!.xAcceleration = force.dx
    fireEmitter!.yAcceleration = -force.dy

    self.addChild(fireEmitter!)

}

给出这个错误: 致命错误:在展开可选值时意外发现 nil

这个错误一开始没有启动(所以它会工作几分钟直到它崩溃)。我试图用 NSKeyedUnarchiver 解开 SKEmitterNode:

    var unWrappedFireEmitter = NSBundle.mainBundle().pathForResource("FireParticles", ofType: "sks")!
    var fireEmitter = NSKeyedUnarchiver.unarchiveObjectWithFile(unWrappedFireEmitter) as! SKEmitterNode
    fireEmitter.position = location
    fireEmitter.name = "fireEmitter"
    ..........
    self.addChild(fireEmitter)

没有任何成功。 如何解开 SKEmitterNode?是 sks 文件中的内容吗? 非常感谢您的帮助!!!!

【问题讨论】:

  • 您正在强制展开 (!)。如果可选变量是nil,那不会神奇地给你一个有效的实例。在强制展开之前,您需要检查它是否不是 nil。这是非常基本的东西,我认为你至少应该阅读 Swift 书:itunes.apple.com/jp/book/swift-programming-language/…
  • 在您的特定情况下,NSBundle... 很可能会返回 nil:例如,您指定了要读取的不存在文件的路径。

标签: sprite-kit swift2 ios9 optional skemitternode


【解决方案1】:

NSKeyedUnarchiver.unarchiveObjectWithFile() 正在抛出异常,因为它需要一个非nil 字符串(类型:String)作为参数,而您传递的是一个 可选 字符串(即,类型 @ 987654324@) 并强制展开它,当它恰好包含 nil(“根本没有值”)而不是有效值时。

这似乎正在发生,因为之前对 NSBundle.mainBundle().pathForResource(_:, ofType:) 的调用肯定失败(在您的资源中找不到路径。即,所述文件不存在)。

在您的特定情况下,此代码应该可以工作:

let optionalFireEmitter = NSBundle.mainBundle().pathForResource("FireParticles", ofType: "sks")

if let unWrappedFireEmitter = optionalFireEmitter {
    // you can use your unWrappedFireEmitter, no need to append "!"
    // (it is already unwrapped)

    // (...your code here...)
}
else{
    // NSBundle.mainBundle().pathForResource() returned nil: Can't use.
    // Make sure the file name and extension you specified are correct
    // and that the resource file is included in your binary.
}

【讨论】:

  • 谢谢,我已经尝试过这种方式,但这会导致更多错误(在 1000' 行代码中)我需要找到一种方法来为 unwrappedFireEmitter 提供非 nil 值,如果 nil.is可能吗?
  • 究竟是什么错误?这是一段很常见的代码。
  • 如果您的pathForResource 返回nil,您将无能为力。您必须修复您传递的名称或扩展名,并确保您的项目具有指定的资源。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-30
  • 2015-03-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多