2016-11-17 45 views
1

我是Swift的新手,正在嘗試編寫一個應用程序來解析網頁中的json。但我得到的錯誤 「不能下標值的類型'[Dictionary]'」不能下標值的類型 - Swift 3

我該如何解決這個問題?它發生多次。以下是我的代碼。謝謝!

func grabData(results: [Dictionary<String, Any?>]){ 
    guard let resultList = results as? [Dictionary<String, Any?>] else { return } 
     for iResult in resultList { 
      var tempResult = SearchResult() 
      tempResult.studentId = self.getInt(dict: [iResult], string: "StudentId") 
      tempResult.LastName = self.getString(dict: [iResult], string: "LastName") 
      tempResult.FirstName = self.getString(dict: [iResult], string: "FirstName") 
      tempResult.Major = self.getString(dict: [iResult], string: "Major") 
      tempResult.Year = self.getString(dict: [iResult], string: "Year") 
      tempResult.GPA = self.getDouble(dict: [iResult], string: "GPA") 
      self.results.append(tempResult) 
     } 
    DispatchQueue.main.async { 
     self.listTableView.reloadData() 
    } 
} 

func getString(dict: [Dictionary<String, Any?>], string: String) -> String? { 
    if let result = dict[Dictionary<String, Any?>] as? String { 
     return result 
    } 
    return nil 
} 

func getInt(dict: [Dictionary<String, Any?>], string: String) -> Int? { 
    if let result = dict[string] as? Int { 
     return result 
    } 
    return nil 
} 

func getDouble(dict: [Dictionary<String, Any?>], string: String) -> Double? { 
    if let result = dict[string] as? Double { 
     return result 
    } 
    return nil 
} 
+0

您可能想要使用庫來解析JSON,這會讓您的生活變得非常簡單......我寫了一個可在https://github.com/borchero/WebParsing上找到的庫。 – borchero

+1

避免在Swift詞典中聲明可選的值類型。他們不是很有意義。 – vadian

回答

0

SearchResult.swift

struct SearchResult { 
    let studentID: Int 
    let lastName: String 
    let firstName: String 
    let major: String 
    let year: String 
    let gpa: Double 

    init?(json: [String:AnyObject]) { 
     guard let studentID = json["StudentID"] as? Int else { 
      return nil 
     } 

     guard let lastName = json["LastName"] as? String else { 
      return nil 
     } 

     guard let firstName = json["FirstName"] as? String else { 
      return nil 
     } 

     guard let major = json["Major"] as? String else { 
      return nil 
     } 

     guard let year = json["Year"] as? String else { 
      return nil 
     } 

     guard let gpa = json["GPA"] as? Double else { 
      return nil 
     } 

     self.studentID = studentID 
     self.lastName = lastName 
     self.firstName = firstName 
     self.major = major 
     self.year = year 
     self.gpa = gpa 
    } 
} 

ViewController.swift

func grabData(json: [String:AnyObject]) { 
    guard let searchResult = SearchResult(json) else { 
     return 
    } 

    self.results.append(searchResult) 

    DispatchQueue.main.async { 
     self.listTableView.reloadData() 
    } 
} 

這篇文章是有幫助的我,當我設計我的模型與一個REST API交互:https://developer.apple.com/swift/blog/?id=37

你的JSON的結構也有所作爲。

例如:

[ 
    { 
     "StudentID": 12345, 
     "LastName": "Smith" 
    } 
] 

將表示爲[[String:AnyObject]](的字符串和AnyObject組合的陣列)

如果有這一點,那麼就需要通過循環,然後單獨地分析每個元件。

+0

這非常有幫助。但是現在我在這條線上發生了一個錯誤...我需要將「String:AnyObject」更改爲?這是行=> 「self.grabData(json:json as [String:AnyObject])」 – tncb

+0

很高興我能幫到你。你遇到了什麼錯誤? –

+0

我在這裏爲它創建了一個新帖子。 http://stackoverflow.com/questions/40663503/cant-convert-value-of-type-swift謝謝! – tncb

0

你好,你可以嘗試改變你的

[Dictionary<String, Any?>] 

[String: Any] 

而且我建議你看看這篇文章 蘋果生產。 (它應該幫助你理解什麼是錯的):

https://developer.apple.com/swift/blog/?id=37

0

它看起來像你對我正在傳遞的字典的數組:

dict: [Dictionary<String, Any?>] 

原本應該改爲:

dict: Dictionary<String, Any?> 

如果你隨後要使用類似的東西:

if let result = dict[string] as? Int 
+0

謝謝你的迴應。我能夠擺脫錯誤,但現在我的應用程序不能正確解析,因爲我沒有得到任何數據來打印。我是新來的stackoverflow,我在我的代碼的其餘部分發表在這個評論或主要職位? – tncb

+0

我很高興能幫上忙。如果這有助於解決您的問題,我會很感激,如果你接受了答案。然後,我會建議儘可能多地評估你的新問題,然後在另一篇文章中提出一個新的詳細問題,並提供與該問題相關的相關代碼。 – Frankie

相關問題