2014-06-09 27 views
13

Bir URL'den json okuyorum ve tekrar (ObjectiveC ile aynı sorunu yaşadım) değerlerim uygulamanızı kilitledi. Dizeler ve Sayılarla ilgili problemim yok. Ben println (değer) yapabilirim, ama değeri bir UILabel'e atadığımda, çöker.Swift. Boş değerler ile json dosyalarına nasıl girebilirim?

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 

} 

Sen bir örneğini görebilirsiniz

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 
} 

... ve özel bir Cell içinde bir UILabel içine değerleri atamak için bu kodu:

Ben JSON okumak için bu yöntemi kullanmak JSON at: https://dl.dropboxusercontent.com/u/787784/example.json

Teşekkürler!

+0

olası yinelenen (http: // stackoverflow.com/questions/24026609/det-a-null-value-in-nsdictionary) – Jeff

cevap

17

objectString değilse, object as String gibi sözdiziminden bir istisna alırsınız. kullanarak, nil numaranızın text'a atanmasıyla sonuçlanabilecek istisnalardan kurtulabilirsiniz. Belirli bir durumda

şunu kullanabilirsiniz:

Ben senin as as? ile değiştirilmesi ve nil coalescing operatörü ?? istismar ettik
cell.address.text = (myJson["list"]![indexPath.row]!["address"] as? String) ?? "default" 

.

+0

Yaparsam: let text = object as? Dize, "metin" Dize yöntemleri olarak adlandırılamıyor Dize yöntemleri olarak algılanan bir dize –

+1

"Nesne" bir "dize" zorlanamıyor, sonra 'metin' nil olacaktır. – GoZoner

+0

Haklısınız !! –

6

Sen saldırıda bulunan satırı değiştirebilirsiniz:

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

as? operatör değerini as olur aynı şekilde dökme, ancak döküm başarısız olursa, bunun yerine nil

if let … sözdizimi atar bunu bir çekle birleştirir ve döküm başarısız olduğunda (ve sıfır döndürülür), diğer blok yerine

1

kullanır:

  • https://github.com/dankogai/swift-json/ Böyle gitmek mümkün olacak:

    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 
    

    o varolmayan düğümlerde çökmez ? veya gerekli ! ve No.

9

Bu çözümü çevrimiçi Swift eğiticisinde buldum. Swift'de null değeriyle nasıl başa çıkılacağı çok güzel bir çözüm.

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

öğretici örnekte:: İşte

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

öğretici için link:

Bu

kavramdır http://jamesonquave.com/blog/developing-ios-8-apps-using-swift-interaction-with-multiple-views/

[NSDictionary bir null değeri Algılama] arasında
+0

Bunu yapmayı denedim ama minik resim yapmaktan vazgeçmek istedim thumbnailURL = (sonuç ["artworkUrl60"]? String? "")! ama işe yaramadı iyi bir yol var mı atama ben onu unwrap olabilir iken? @Marijan V. –