2016-11-17 41 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

相关问题