Фатальная ошибка: неожиданно обнаружен ноль при развертывании необязательного значения в Swift при попытке проанализировать JSON
Я пытался создать основанное на документе приложение Какао, и когда я попытался проанализировать JSON в readFromData: ofType: error:
Метод, я получил ошибку: fatal error: unexpectedly found nil while unwrapping an Optional value
, Фактическая строка, которая вызвала ошибку, выглядит следующим образом:
override func readFromData(data: NSData?, ofType typeName: String?, error outError: NSErrorPointer) -> Bool {
var error: NSErrorPointer!
var loadedDictionary = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.AllowFragments, error: error) as? NSDictionary // this causes an error
return true
}
Похоже, NSJSONSerialization.JSONObjectWithData()
Метод вызвал ошибку, но почему он ее выдал?
Я изменился options:
аргумент либо nil
или же 0
, а также изменилось error:
аргумент nil
, но ничего не решило проблему.
Я также гарантировал, что data
не является nil
,
Так чего мне не хватает? Я думаю, что метод JSON пытался принудительно развернуть его, но как я могу это знать? И как я могу избежать фатальной ошибки и правильно запустить мое приложение?
Я использую Xcode6-beta 3 на Yosemite beta3.
3 ответа
Скорее всего, проблема в том, что у вас есть данные, которые на самом деле не являются JSON, поэтому десериализация вернет nil, или данные будут массивом, и преобразование их в словарь, очевидно, приведет к сбою.
Вы, кажется, не понимаете некоторые основы. Как вы думаете, что AllowFragments собирается достичь? И почему вы изменили ошибку на ноль? Вы понимаете, для чего существует переменная ошибки? Он расскажет вам, какие ошибки обнаружил анализатор JSON. Установив переменную в ноль, вы не позволяете ей помочь вам.
Если данные не содержат действительный объект JSON, JSONObjectWithData
Функция вернет ноль, поэтому вам нужно выполнить условное развертывание следующим образом:
if let dict = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: jsonError) as? NSDictionary {
println("Dictionary: \(dict)")
} else {
println("nil")
let resultString = NSString(data: data, encoding: NSUTF8StringEncoding)
println("Flawed JSON String: \(resultString)")
}
Я надеюсь, что это помогает..... е
- В этом случае outError предоставляется в качестве аргумента, поэтому вы должны использовать его (я упустил это из виду).
- Похоже, целью этой функции является проверка правильности данных в формате JSON.
Тогда ваша функция должна быть:
override func readFromData(data: NSData?, ofType typeName: String?, error outError: NSErrorPointer) -> Bool {
if let loadedDictionary = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.AllowFragments, error: outError) as? NSDictionary {
return true
} else {
return false
}
}
Теперь эта функция:
- ошибка записи туда, где абонент указал
ourError
в случае возникновения ошибки - возвратите, если данные действительны в формате JSON как NSDictionary
К вашему сведению, я тоже написал обработчик JSON.
Который включает в себя NSJSONSerialization.JSONObjectWithData
,