2014-11-03 137 views
0

我有一個API返回的是這樣的:無法轉換JSON結果爲結構

{ 
elements:[{ 
    name = "user1", 
    details =  { 
     phone = "0033612345678" 
    } 
}, 
{ 
    name = "user2", 
    details =  { 
     phone = "0033612346612" 
    } 
}, 
{ 
    name = "test3" 
}] 
} 

細節關鍵是不存在於每個元素

我已經定義了一個ElementModel.swift文件,我想爲elements數組的每個元素創建一個ElementModel實例。

import Foundation 

struct ElementModel { 
    var name:String 
    var phone:String 
} 

爲了獲取名稱和電話值,我創建了下面的函數,當正確執行的請求調用(使用delagation)

func getRequestSucceed(results: NSDictionary) { 
    println("getRequestSucceed") 

    // Loop through list of elements 
    let elementsArray = results["elements"] as NSArray 
    var elementsTmpArray:[ElementModel] = [] 

    // Convert each result into Element object 
    for var i=0;i<elementsArray.count;i++ 
    { 
     // Get NSDictionary from each element 
     let element = elementArray[i] as NSDictionary 

     // Create Element object with parameters from dictionary 
     var name = element["name"] as String 
     var phone:String = "" 

     // If details key exists, get phone attribute 
     if let details = element["details"] as? NSDictionary { 
      println(details["phone"]) // Phone number is correctly displayed 
      phone = details["phone"] as String // Simulator crash occurs the first time 
     } else { 
      println("Not defined") 
     } 

     // Create element model with name and phone 
     var t = ElementModel(name: name, phone: phone) 
     elementsTmpArray.append(t) 
    } 

    // Update table view 
    dispatch_async(dispatch_get_main_queue(), { 
     self.elements = elementsTmpArray 
     self.elementsTableView!.reloadData() 
    }) 
} 

這種方法行不通,似乎像細節[「電話」]不能以這種方式檢索。我對swift非常陌生,並且不太瞭解Optional。只是想知道是否可選參與這個問題。
有什麼想法?

+1

請在投票問題時添加註釋,以便它可以幫助理解問題爲什麼不好或其他問題。 – Luc 2014-11-03 12:55:43

+0

我總是討厭Downvote Drive-Bys ... 我也遇到類似的問題。爲了解決這個問題,我必須對第一個對象進行硬編碼,第一個對象包含一些數據,比如你稱之爲「元素」,但錯誤的是,如果你改變了這個喲[0],我確信它可能會起作用。至少它爲我做了。我認爲是Swift的一個bug。 – 2014-11-04 19:24:40

+0

順便問一下,你忘了問,你甚至在調試時輸入你的For循環?是NSArray顯示爲nil的數組let letArray = results [「elements」]? – 2014-11-04 19:28:58

回答

0
details["phone"] 

如果details是字典中,上述標表達式的類型是可選的(字典返回nil,如果有對應於下標沒有元素),所以它不能被轉換爲字符串。您需要在演員表演之前解開結果至String

+0

phone = details [「phone」]!作爲字符串給我同樣的崩潰。 – Luc 2014-11-03 14:51:24

+0

@Luc'details [「phone」] as String?'should work,returned an optional string。請注意,您需要將該值保存爲可選項,因爲它顯然可以是「nil」。您不能將其轉換爲非可選項。 – Sulthan 2014-11-03 14:56:41

+0

@Luc您需要檢查返回的對象是否可以轉換爲字符串。 – JeremyP 2014-11-04 09:42:37