致命错误:使用 JSON 文件和 SwiftyJSON 解包可选值时意外发现 nil



我在 swift 中parseJSON()函数中有此代码,它将检索 json 文件中的Makes,但我收到一个错误,说fatal error: unexpectedly found nil while unwrapping an Optional value

注意:我正在使用 SwiftyJSON,错误指向if condition

func parseJSON() {
            let path: String = NSBundle.mainBundle().pathForResource("vehicles", ofType: "json") as String!
            let jsonData = NSData(contentsOfFile: path) as NSData!
            let readableJSON = JSON(data: jsonData, options: NSJSONReadingOptions.MutableContainers, error: nil)
            numberOfRows = readableJSON.count
            for element in 1...numberOfRows {
                var Makes = readableJSON[element]["Make"]
                if !makeArray.contains(Makes.string! && ){ // error is pointing here!
                    let Make = readableJSON[element]["Make"].string as String!
                    makeArray.append(Make)
                }
            }
        }

SwiftyJSON 对象的 .string 属性是一个可选的 getter

其值可以存在,也可以为零。

因此,您必须在使用前安全地打开包装。

最简单的例子:

if let makeString = Makes.string {
    if !makeArray.contains(makeString) {
        let Make = readableJSON[element]["Make"].stringValue
        makeArray.append(Make)
    }
}

如您所注意到的,对于 SwiftyJSON,与可选的 .string getter 相反的是非可选的 .stringValue getter。

但要小心!如果此属性为 nil,则应用将崩溃。

.stringValue.string!相同

因此,您也可以在那里使用可选的 getter 和"if let":

if let makeString = Makes.string {
    if !makeArray.contains(makeString) {
        if let Make = readableJSON[element]["Make"].string {
            makeArray.append(Make)
        } else {
            // readableJSON[element]["Make"].string is nil, handle the error
        }
    }
} else {
    // Makes.string is nil, handle the error
}

等等,你明白了。

也可以通过使用where来简化:

if let makeString = Makes.string where !makeArray.contains(makeString) {
    if let Make = readableJSON[element]["Make"].string {
        makeArray.append(Make)
    } else {
        // readableJSON[element]["Make"].string is nil, handle the error
    }
} else {
    // Either Makes.string is nil or makeArray does contain it, handle the rror
}

最新更新