我正在从URL读取json,并且(我在ObjectiveC中遇到了同样的问题)这些值会导致我的应用程序崩溃。我对字符串和数字没有任何问题。我可以打印(值)但是当我将值分配给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
}
您可以在https://dl.dropboxusercontent.com/u/787784/example.json
查看JSON的示例谢谢!
答案 0 :(得分:17)
如果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运算符??
。
答案 1 :(得分:9)
我在在线Swift教程中找到了这个解决方案。如何在Swift中处理null值是一个非常好的解决方案。
这是概念:
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/
答案 2 :(得分:6)
您可以将违规行更改为:
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块会运行
答案 3 :(得分:1)
如果您使用:
你可以这样:
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
不需要?
或!
,并且在不存在的节点上不会崩溃。