2016-12-31 10 views
-1

ich mit der Initialisierung Struct ein Problem habe mit JSON Daten aus der URLRequest in Swift 3.flatMap, Struct und JSON in Swift 3

Das Protokoll JSONDecodable erhalten:

protocol JSONDecodable { 
      init?(JSON: [String : AnyObject]) 
     } 

ist die Struktur wie folgt und es implementiert Erweiterung, die zu JSONDecodable entspricht:

struct Actor { 
    let ActorID: String 
    let ActorName: String 
} 

extension Actor: JSONDecodable { 
    init?(JSON: [String : AnyObject]) { 
     guard let ActorID = JSON["ActorID"] as? String, let ActorName = JSON["ActorName"] as? String else { 
      return nil 
     } 
     self.ActorID = ActorID 
     self.ActorName = ActorName 

    } 
} 

Dann habe ich den folgenden Code, wo ich versuche, eine Reihe von Wörterbüchern zu kartieren Schauspieler auf struct. Ich denke, dass ich Swift 2 und Swift 3 Syntax zusammen mische.

guard let actorsJSON = json?["response"] as? [[String : AnyObject]] else { 
        return 
       } 

       return actorsJSON.flatMap { actorDict in 
        return Actor(JSON: actorDict) 
       } 

Allerdings bekomme ich folgende Fehlermeldung: 'flatMap' produces '[SegmentOfResult.Iterator.Element]', not the expected contextual result type 'Void' (aka '()')

Jede Hilfe wäre sehr dankbar!

+0

In dem Verfahren, in dem Sie das 'flatMap' Ergebnis zurück, so scheint es, als ob Sie den Rückgabetyp in der Funktion Signatur mit Anmerkungen versehen Typen Vergessenes zu haben. Nun, Sie haben uns diese Funktion nicht gezeigt, aber stellen Sie sicher, dass Ihre Funktion nicht wie 'func myFunction (einige Argumente) {...' aussieht, sondern 'func myFunction (einige Argumente) -> [Actor] {. ..'. – dfri

Antwort

0

Wie @dfri erwähnt, haben Sie uns Ihre Funktionssignatur nicht gezeigt, aber ich rate auch, dass Sie den Rückgabetyp der Funktion nicht angegeben haben. Diese

ist, wie ich es tun würde, obwohl

typealias JSONDictionary = [String: AnyObject] 
extension Actor { 
    func all(_ json: JSONDictionary) -> [Actor]? { 
     guard let actorsJSON = json["response"] as? [JSONDictionary] else { return nil } 
     return actorsJSON.flatMap(Actor.init).filter({ $0 != nil }).map({ $0! }) 
    } 
}