Подтвердить что ты не робот

Swift. Как я могу обращаться с нулевыми значениями в json файлах?

Я читаю json из URL-адреса и, опять же (у меня была такая же проблема с ObjectiveC), значения разбивают мое приложение. У меня нет проблем со строками и цифрами. Я могу println (значение), но когда я назначаю значение в UILabel, он сработает.

Я использую этот метод для чтения JSON:

func jsonFromURL(jsonURL: String) -> Dictionary<String, AnyObject> {
    var jsonNSURL: NSURL = NSURL(string: jsonURL)
    let jsonSource: NSData = NSData(contentsOfURL: jsonNSURL)
    var json = NSJSONSerialization.JSONObjectWithData(jsonSource, options:NSJSONReadingOptions.MutableContainers, error: nil) as Dictionary<String, AnyObject>
    return json
}

... и этот код для назначения значений в UILabel внутри пользовательской ячейки

func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell? {

    var regularTextCell:celda = celda(style: UITableViewCellStyle.Default, reuseIdentifier: "cell")
    var cell:celda = NSBundle.mainBundle().loadNibNamed("celda", owner: self, options: nil)[0] as celda

    cell.name.text = myJson["list"]![indexPath.row]!["name"] as String
    cell.id.text = "id: " + String(myJson["list"]![indexPath.row]!["id"] as Int)

    // THIS line crash because some values of adress are <null>
    cell.address.text = myJson["list"]![indexPath.row]!["address"] as String

    return cell

}

Вы можете просмотреть пример JSON по адресу: https://dl.dropboxusercontent.com/u/787784/example.json

Спасибо!

4b9b3361

Ответ 1

Вы получите исключение из синтаксиса типа object as String, если object не является String. Вы можете избежать исключения, используя object as? String, который может привести к назначению nil в ваш text.

В вашем конкретном случае вы можете использовать:

cell.address.text = (myJson["list"]![indexPath.row]!["address"] as? String) ?? "default"

где я заменил ваш as на as? и использовал оператор nil-coalescing ??.

Ответ 2

Я нашел это решение в онлайн-учебнике Swift. Это очень хорошее решение, как иметь дело с нулевым значением в Swift.

Это понятие:

 let finalVariable = possiblyNilVariable ?? "Definitely Not Nil Variable"

В учебном примере:

  let thumbnailURL = result["artworkUrl60"] as? String ?? ""

Вот ссылка для учебника: http://jamesonquave.com/blog/developing-ios-8-apps-using-swift-interaction-with-multiple-views/

Ответ 3

Вы можете изменить строку нарушения на:

if let address = myJson["list"]![indexPath.row]!["address"] as? String {
  cell.address.text = address
}
else {
  cell.address.text = ""
}

Оператор as? будет отличать это значение так же, как и as, но если сбой кастинга, он вместо этого назначит nil

Синтаксис if let … объединяет это с проверкой, и когда сбой кастинга (и возвращается nil), вместо этого выполняется блок else

Ответ 4

Если вы используете:

Вы сможете сделать следующее:

let yourJSON = JSON.fromURL("https://dl.dropboxusercontent.com/u/787784/example.json")
for (i, node) in yourJSON["list"] {
    let isnull = node["address"].isNull
    println("//[\"list\"][\(i)]:\t\(isnull)")
}

//["list"][0]:  false
//["list"][1]:  false
//["list"][2]:  true
//["list"][3]:  false
//["list"][4]:  false
//["list"][5]:  true
//["list"][6]:  false
//["list"][7]:  false
//["list"][8]:  false
//["list"][9]:  false
//["list"][10]: false
//["list"][11]: false
//["list"][12]: true
//["list"][13]: false
//["list"][14]: false
//["list"][15]: false
//["list"][16]: false
//["list"][17]: false
//["list"][18]: false
//["list"][19]: false

Нет ? или !, и он не сбой на несуществующих узлах.