解包可选值时找到nil

时间:2015-12-01 18:07:01

标签: ios swift fatal-error optional-values unwrap

您可能会想:"关于此错误的其他帖子"。 是的,我在写这个问题之前一直在研究这个论坛,不幸的是我无法找到可以提供帮助的东西,或者至少我知道当一个var没有绑定时会出现这个错误。

然而,由于我对此很新,我想要一些帮助。 我按照指南制作了一个简单的无限侧滚动游戏。 到目前为止一切都很顺利,但后来我遇到了这个" nill"错误。 指南本身没有这个错误。

所以我想也许可能是我使用更新版本的xCode或iphone模拟。但我很确定它与此无关。

到目前为止我的编纂:

import Foundation

class MainScene: CCNode {
    weak var hero: CCSprite!

    func didLoadFromCCB() {
       userInteractionEnabled = true
    }

    override func touchesBegan(touch: CCTouch!, withEvent event: CCTouchEvent!) {
       // This is the error line. I think it is caused by (applyImpulse(ccp(0, 400)) )
        hero.physicsBody.applyImpulse(ccp(0, 400)) 
    }
}

我怎样才能解决这个问题? 我应该用applyImpulse创建变量吗? 我也尝试在CGPoint(ccp)和CCPackage之间切换,两者都没有用。

2 个答案:

答案 0 :(得分:3)

  weak var hero: CCSprite!

这非常危险,可能是导致问题的原因。除了使用!之外,这几乎总是要避免,这与weak混合使用。这意味着,如果其他停止指向hero变量将成为隐式解包nil。下次访问它时,会崩溃。

首先,摆脱!。如果需要weak,请使用?。除此之外,决定它是否真的应该是强大的。你在这里所展示的一切都没有表明它应该是弱者。

答案 1 :(得分:0)

我认为上面的错误代码会给新人带来很多困惑,因为我们不知道什么是"可选"在swift 2.0与旧版本的swift中。例如,我得到了同样的错误,无法分辨出问题所在。我发现的是我正在调用一个使用括号()的方法,并且在同一个函数中我调用了没有括号的方法。这导致了上面的错误。 ()是一个可选组件,以我理解的方式成为Swift 2.0的可选组件。调用方法时必须保持一致,否则编译器将在解包可选值"时抛出" Found nil错误。这是我的代码:我不一致地调用的方法是NSDirectoryEnnumerationOptions()。我在分享的示例中对此进行了更正:

      func listFilesWithFilter() -> [String]
{
NSFileManager().URLForDirectory(.DocumentDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: true)
    let musicUrl = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask).first!
    do{
        let fileList = try NSFileManager.defaultManager().contentsOfDirectoryAtURL(musicUrl,includingPropertiesForKeys: nil, options: NSDirectoryEnumerationOptions())
        print(fileList)
    } catch let error as NSError {
        print(error.localizedDescription)
    }
    // filter for wav files 
    do {
        let directoryUrls = try NSFileManager.defaultManager().contentsOfDirectoryAtURL(musicUrl, includingPropertiesForKeys: nil, options: NSDirectoryEnumerationOptions())
        print(directoryUrls)
        let wavFiles = directoryUrls.filter(){ $0.pathExtension == "wav"}.map{ $0.lastPathComponent}
        print ("WavFiles:\n" + wavFiles.description)
    } catch let error as NSError {
        print(error.localizedDescription)
    }
    return wavFiles
    }