Обнаружено ноль при развертывании необязательного значения
Вы можете подумать: "еще один пост об этой ошибке". Да, я просматривал этот форум, прежде чем писать этот вопрос, и, к сожалению, я не смог найти что-то, что могло бы помочь, или, по крайней мере, я знаю, что эта ошибка возникает, когда существует переменная, которая не связана.
Однако, поскольку я довольно новичок в этом, я хотел бы помочь. Я следую инструкциям по созданию простой бесконечной игры с боковыми скроллерами. Пока все прошло хорошо, но потом я столкнулся с этой "нулевой" ошибкой. Само руководство не имеет этой ошибки.
Я подумал, может быть, я использую более новую версию симуляции 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 ответа
weak var hero: CCSprite!
Это невероятно опасно и, вероятно, является причиной вашей проблемы. Помимо использования !
, которого почти всегда следует избегать, это смешивает его с weak
, Это означает, что если что-то перестает указывать на hero
эта переменная становится неявно развернутой nil
, В следующий раз, когда вы получите к нему доступ, вы упадете
Во-первых, избавиться от !
, Если это должно быть weak
использовать ?
, Кроме того, решите, должно ли оно быть действительно сильным. ничто из того, что вы здесь показали, не говорит о том, что оно должно быть слабым.
Я думаю, что приведенный выше код ошибки может вызвать замешательство у новых людей, потому что мы не знаем, что является "необязательным" в swift 2.0 по сравнению со старыми версиями swift. Например, я получаю ту же ошибку и не могу сказать, где проблема. Я обнаружил, что я вызывал метод с помощью круглых скобок () и в той же функции я вызывал метод без круглых скобок. Это вызвало ошибку выше. () - это необязательный компонент, который стал необязательным в Swift 2.0, как я понимаю. Вы должны быть последовательны при вызове методов, иначе компилятор выдаст сообщение "Обнаружена ошибка 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
}