2016-11-17 5 views
1

subscript Ich bin neu in Swift und versuche, eine Anwendung zum Parsen von Json von einer Webseite zu schreiben. Allerdings bekomme ich den Fehler "Kann nicht einen Wert vom Typ '[Wörterbuch]'"Kann keinen Wert des Typs - Swift 3

Wie kann ich das beheben? Es tritt mehrmals auf. Folgendes ist mein Code. Vielen Dank!

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

Vielleicht möchten Sie eine Bibliothek für die Analyse von JSON verwenden, dies würde Ihr Leben ziemlich einfach machen ... Ich schrieb eine Bibliothek, die unter https://github.com/borchero/WebParsing verfügbar ist. – borchero

+1

Vermeiden Sie die Angabe optionaler Werttypen in Swift-Wörterbüchern. Sie sind nicht sehr sinnvoll. – vadian

Antwort

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() 
    } 
} 

Dieser Beitrag wurde mir hilfreich, wenn ich mein Modell der Gestaltung mit einem REST-API zu interagieren: https://developer.apple.com/swift/blog/?id=37

Die Struktur Ihres JSON macht auch einen Unterschied.

Zum Beispiel:

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

Würde als [[String:AnyObject]] (ein Array von String und ANYOBJECT Kombinationen) dargestellt werden

Wenn Sie diese haben, dann müssen Sie eine Schleife durch und dann jedes Element analysieren einzeln.

+0

Das war sehr hilfreich. Aber jetzt bekomme ich einen Fehler in dieser Zeile ...Was muss ich ändern um "String: AnyObject" zu ändern? Das ist die Zeile => "self.grabData (json: json als [String: AnyObject])" – tncb

+0

Ich bin froh, dass ich helfen konnte. Welchen Fehler bekommst du? –

+0

Ich habe hier einen neuen Beitrag erstellt. http://stackoverflow.com/questions/40663503/cant-convert-value-of-type-swift Vielen Dank! – tncb

0

Hallo können Sie versuchen, Ihre

[Dictionary<String, Any?>] 

zu

[String: Any] 

Wechsel Und ich würde Sie in diesem Artikel gemacht von Apple aussehen empfehlen. (Es sollte Ihnen mit Verständnis helfen, was falsch ist):

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

0

Es sieht für mich wie Sie in einer Reihe von Wörterbüchern vorbei sind:

dict: [Dictionary<String, Any?>] 

die stattdessen sein sollte:

dict: Dictionary<String, Any?> 

Wenn du gehst, dann anschließend wie etwas verwenden:

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

Vielen Dank für Ihre Antwort. Ich konnte die Fehler loswerden, aber jetzt wird meine Anwendung nicht korrekt analysiert, da ich keine Daten zum Drucken bekomme. Ich bin neu in stackoverflow, poste ich den Rest meines Codes hier in diesem Kommentar oder Hauptpost? – tncb

+0

Ich bin froh, dass ich helfen konnte. Wenn dies Ihr Problem lösen würde, würde ich mich freuen, wenn Sie die Antwort akzeptieren würden. Dann würde ich empfehlen, Ihr neues Problem so gut wie möglich zu bewerten und dann eine neue detaillierte Frage in einem anderen Beitrag mit relevantem Code zu diesem Problem zu stellen. – Frankie

Verwandte Themen