2014-06-09 16 views
13

Tôi đang đọc json từ một URL và, một lần nữa (tôi đã có cùng một vấn đề với ObjectiveC) các giá trị làm hỏng ứng dụng của tôi. Tôi không có bất kỳ vấn đề với Strings và số. Tôi có thể println (giá trị) nhưng khi tôi gán giá trị vào một UILabel, nó bị treo.Swift. Làm thế nào tôi có thể đối phó với các giá trị null vào các tập tin json?

tôi sử dụng phương pháp này để đọc các 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 
} 

... và mã này để gán giá trị vào một UILabel bên trong một tế bào tùy chỉnh

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 

} 

Bạn có thể xem một ví dụ về JSON tại: https://dl.dropboxusercontent.com/u/787784/example.json

Cảm ơn!

+0

thể trùng lặp của [Dò tìm một giá trị Null trong NSDictionary] (http: // stackoverflow.com/questions/24026609/detect-a-null-value-in-nsdictionary) – Jeff

Trả lời

17

Bạn sẽ nhận được ngoại lệ từ cú pháp như object as String nếu object không phải là String. Bạn có thể tránh ngoại lệ bằng cách sử dụng object as? String có thể dẫn đến việc nil được chỉ định vào text của bạn.

Trong trường hợp cụ thể của bạn, bạn có thể sử dụng:

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

nơi tôi đã thay thế của bạn as với as? và khai thác các nhà điều hành nil-coalescing ??.

+0

nếu tôi làm: hãy để text = object là? Chuỗi, "văn bản" Tôi không thể gọi các phương thức String trên văn bản vì nó không được nhận dạng như một chuỗi –

+1

Nếu 'đối tượng' không thể bị ép buộc thành' Chuỗi' thì 'văn bản' sẽ là' nil'. – GoZoner

+0

Bạn nói đúng !! –

6

Bạn có thể thay đổi dòng vi phạm đến:

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

Nhà điều hành as? sẽ bỏ giá trị theo cùng một cách as sẽ, nhưng nếu đúc thất bại, nó sẽ thay gán nil

Cú pháp if let … kết hợp điều này với một kiểm tra và khi đúc thất bại (và nil được trả về) khối khác chạy thay vì

1

Nếu bạn sử dụng:

Bạn sẽ có thể đi như thế này:

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 

Không ? hoặc ! cần thiết và nó không sụp đổ trên các nút không tồn tại.

9

Tôi đã tìm thấy giải pháp này trong hướng dẫn Swift trực tuyến. Đó là giải pháp rất tốt đẹp làm thế nào để đối phó với giá trị null trong Swift.

Đây là khái niệm:

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

Trong ví dụ hướng dẫn:

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

Dưới đây là liên kết để hướng dẫn: http://jamesonquave.com/blog/developing-ios-8-apps-using-swift-interaction-with-multiple-views/

+0

Tôi đã cố gắng để làm điều này nhưng tôi muốn unwrap các giá trị bằng cách làm cho thumbnailURL = (kết quả ["artworkUrl60"] như? String ?? "")! nhưng đã không làm việc là có một cách tốt mà trong khi nhiệm vụ tôi có thể unwrap nó? @Marijan V. –

Các vấn đề liên quan