Обнаружено ноль при развертывании необязательного значения

Вы можете подумать: "еще один пост об этой ошибке". Да, я просматривал этот форум, прежде чем писать этот вопрос, и, к сожалению, я не смог найти что-то, что могло бы помочь, или, по крайней мере, я знаю, что эта ошибка возникает, когда существует переменная, которая не связана.

Однако, поскольку я довольно новичок в этом, я хотел бы помочь. Я следую инструкциям по созданию простой бесконечной игры с боковыми скроллерами. Пока все прошло хорошо, но потом я столкнулся с этой "нулевой" ошибкой. Само руководство не имеет этой ошибки.

Я подумал, может быть, я использую более новую версию симуляции 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
    }  
Другие вопросы по тегам