2017-03-04 2 views
0

Im meinen App swift 3Update auf schnelle 3 JSON-Datei

Aktualisierung Ich habe ein paar Fehler

for (k, v): (AnyObject, AnyObject) in value { 

Rufen ein NSDictionary.Iterator.Element immer konvertierbar ist nicht auf (ANYOBJECT, ANYOBJECT)

Subsiquently Im bekommen diesen Fehler

var artworks = [Artwork]() 
func loadInitialData() { 
    // 1 
    let fileName = Bundle.main.path(forResource: "PublicArt", ofType: "json"); 

    let data: Data = try! Data(contentsOf: URL(fileURLWithPath: fileName!), options: NSData.ReadingOptions(rawValue: 0)) 

    // 2 
    var error: NSError? 
    let jsonObject: AnyObject! 
    do { 
     jsonObject = try JSONSerialization.jsonObject(with: data, 
        options: JSONSerialization.ReadingOptions(rawValue: 0)) 
    } catch let error1 as NSError { 
     error = error1 
     jsonObject = nil 
    } 

    // 3 
    if let jsonObject = jsonObject as? [String: AnyObject], error == nil, 
     // 4 
     let jsonData = JSONValue.fromObject(jsonObject)?["data"]?.array { 
      for artworkJSON in jsonData { 
       if let artworkJSON = artworkJSON.array, 
        // 5 
        let artwork = Artwork.fromJSON(artworkJSON) { 
         artworks.append(artwork) 
       } 
      } 
    } 
}  

JsonObject produziert 'ANY' nicht den erwarteten kontextuellen Ergebnistyp 'ANYOBJECT'

und

Argumenttyp [String: ANYOBJECT] nicht

'ANYOBJECT' zu erwarten Typen entsprechen

Ich nehme an, das ist eine einfache, aber ich habe nicht in einem Jahr codiert und wäre sehr dankbar für die Hilfe

Dank

Travis

UPDATE

Also ich aktualisiert nur den Code

aber in der JSON.swift

static func fromObject(_ object: AnyObject) -> JSONValue? { 
    switch object { 
    case let value as NSString: 
     return JSONValue.jsonString(value as String) 
    case let value as NSNumber: 
     return JSONValue.jsonNumber(value) 
    case _ as NSNull: 
     return JSONValue.jsonNull 
    case let value as NSDictionary: 
     var jsonObject: [String:JSONValue] = [:] 
     for (k, v): (AnyObject, AnyObject) in value { 
     if let k = k as? NSString { 
      if let v = JSONValue.fromObject(v) { 
      jsonObject[k as String] = v 
      } else { 
      return nil 
      } 
     } 
     } 
     return JSONValue.jsonObject(jsonObject) 
    case let value as NSArray: 
     var jsonArray: [JSONValue] = [] 
     for v in value { 
     if let v = JSONValue.fromObject(v as AnyObject) { 
      jsonArray.append(v) 
     } else { 
      return nil 
     } 
     } 
     return JSONValue.jsonArray(jsonArray) 
    default: 
     return nil 
    } 
    } 

} 

Fehlerdatei ein Fehler bekommen ist:

nsdictionary.iterate.element '(aka (Schlüssel: Jeder, Wert: Any)') ist nicht umwandelbar 'ANYOBJECT, ANYOBJECT)' für

für Codezeile

for (k, v): (AnyObject, AnyObject) in value { 

Entschuldigung die späte Antwort

Grüße

Travis

+0

Die Fehler in der zweiten Hälfte sind in // 2 und // 4 bzw. – travis

Antwort

0

Sie verwenden zu viel AnyObject aka it's-an-object-but-i-don-know-the-type.

Da die JSON-Datei in Ihrem Bundle enthalten ist, kennen Sie genau die Typen aller Objekte. In Swift 3 ist ein JSON-Wörterbuch [String:Any] und ein JSON-Array ist [[String:Any]].

Allerdings weiß ich nicht die genaue Struktur des JSON und ich weiß nicht, was JSONValue tut - eine Third-Party-Bibliothek ist eigentlich nicht notwendig - aber dies könnte ein Ausgangspunkt sein, um das Array für Schlüssel data zu erhalten.

func loadInitialData() { 

    let fileURL = Bundle.main.url(forResource: "PublicArt", withExtension: "json")! 

    do { 
     let data = try Data(contentsOf: fileURL, options: []) 

     let jsonObject = try JSONSerialization.jsonObject(with: data) as! [String: Any] 
     let jsonData = jsonObject["data"] as! [[String:Any]] 
     for artworkJSON in jsonData { 
      print(artworkJSON) 
      // ... create Artwork items 
     } 
    } catch { 
     print(error) 
     fatalError("This should never happen") 
    } 
} 
+0

Hi, ich habe es gerade versucht. das funktionierte, aber ich habe immer noch einen Fehler in meiner JSON.swift-Datei, die ich gerade realisiert habe – travis

+0

Bedenke, dass der nicht spezifizierte JSON-Typ in Swift 3 'Any' ist – vadian

Verwandte Themen