您可能会想:"关于此错误的其他帖子"。 是的,我在写这个问题之前一直在研究这个论坛,不幸的是我无法找到可以提供帮助的东西,或者至少我知道当一个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之间切换,两者都没有用。
答案 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
}