2017-02-03 7 views
0

Ich versuche, json-Daten (im Array-Format) abzurufen und zu überprüfen, ob mein lokales Array die Daten bereits enthält, falls es sich bewegt auf den nächsten Wert in den JSON-Daten, bis ihr Wert ein Wert ist, den das Array nicht enthält, und dann an das Array anhängen. Diese Daten im Array müssen in der richtigen Reihenfolge sein. Ich versuche, dies jetzt zu tun, aber den Fehler:Typ 'customDataObject' entspricht nicht dem Protokoll 'Sequence'

Type 'ResultsGenrePosters' does not conform to protocol 'Sequence'

Dies ist, wie es aussieht:

public struct ResultsGenrePosters: Decodable { 

    public let results : [GenrePosters]? 

    public init?(json: JSON) { 
    results = "results" <~~ json 
    } 
} 


public struct GenrePosters: Decodable { 

    public let poster : String 

    public init? (json: JSON) { 

    guard let poster: String = "poster_path" <~~ json 
    else {return nil} 
    self.poster = poster 
    } 

    static func updateGenrePoster(genreID: NSNumber, urlExtension: String, completionHandler:@escaping (_ details: [String]) -> Void){ 

    var posterArray: [String] = [] 

    let nm = NetworkManager.sharedManager 

    nm.getJSONData(type:"genre/\(genreID)", urlExtension: urlExtension, completion: { 
     data in 

     if let jsonDictionary = nm.parseJSONData(data) 
     { 
     guard let genrePosters = ResultsGenrePosters(json: jsonDictionary) 

      else { 
      print("Error initializing object") 
      return 
     } 
     guard let posterString = genrePosters.results?[0].poster 

      else { 
      print("No such item") 
      return 
     } 

     for posterString in genrePosters { 

      if posterArray.contains(posterString){continue 
      } else { posterArray.append(posterString) } //This is where the error happens 

     } 
     } 
     completionHandler(posterArray) 
    }) 
    } 

} 
+0

Ihre Namensgebung ist eine Art Singular/Plural Verwirrung ;-) – vadian

Antwort

0

Alt + Klick auf genrePosters und was es Ihnen nicht sagen? Es sollte seine ResultsGenrePosters sagen, weil das der Fehler ist. Schau dir jetzt die Art von posterArray an; Es ist ein Array von String, nicht Array ResultsGenrePosters. Ich denke du meinst für poster in genrePosters zu schreiben und hast dich über die Typen verwirrt, weil du für posterString in genrePosters geschrieben hast.

Vielleicht möchten Sie genrePosters mithilfe der Karte in einen [String] umwandeln?

Dies verwandelt Ihr posterArray, wenn es in einem Array mit nur den Posternamen besteht. Wenn es nicht existiert, erhalten Sie ein leeres Array. Dies funktioniert nur, wenn poster String ist. Wenn seine Zeichenfolge? Sie sollten stattdessen FlatMap verwenden.

let posterNames = genrePosters.results?.map { $0.poster } ?? [String]() 
+0

Ich sehe, was Sie bekommen an, habe ich versucht, so etwas wie dies zu tun: [? GenrePosters.results [0] .poster] bewachen posterStringArray = lassen else { print ("No such Punkt") return } für Poster in posterStringArray { wenn posterArray.contains (posterString) {weiter } else {posterArray.append (posterString)} // Dies ist wo der Fehler passiert Aber 210} – SwiftyJD

+0

eine Fehlermeldung erhalten: Initializer für bedingte Bindung muß Optional Typen hat, nicht auf der Linie "[String?] [? GenrePosters.results [0] .poster] schützen lassen posterStringArray = – SwiftyJD

+0

bearbeiten ich die Antwort. –

Verwandte Themen