2017-02-03 13 views
0

私がしようとしているのは、jsonデータ(配列形式です)を取得し、ローカルの配列にデータが含まれているかどうかを確認します配列に含まれていない値にJSONデータの次の値を設定し、それを配列に追加します。配列内のこのデータは、順番に並んでいる必要があります。私はこれを行うにしようとしてる今が、エラーが出ます:タイプ 'customDataObject'がプロトコル 'シーケンス'に準拠していません

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

あなたの命名は、私がこのような何かをやってみました、私はあなたがになっているか見単数/複数の混乱;-) – vadian

答えて

0

Altキー+ genrePostersをクリックして、何それはあなたを教えてくれん:

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

これは、それがどのように見えるのですか?それは、エラーが何を言っているのか、そのResultsGenrePostersと言うべきです。さて、posterArrayの型を見てみましょう。配列ResultsGenrePostersではなくStringの配列です。あなたはのポスターのを書き、genrePostersのposterStringにと書いたので、タイプについて混乱していると思います。

多分、あなたは[genrePosters]を[String]に変換するためにマップを使いたいのですか?

posterArrayが存在する場合は、ポスター名だけの配列に変換されます。存在しない場合は空の配列が返されます。これは、posterがStringの場合にのみ機能します。その文字列ならば?代わりにflatMapを使用してください。

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

の一種である:[?genrePosters.results [0] .poster] posterStringArray =を聞かせてガードposterStringArray { におけるポスターのための他 {印刷( "そのようなアイテム") リターン} posterArray.containsは(posterString){これは//} }他{posterArray.append(posterString)を続ける場合エラーが発生した場所 } – SwiftyJD

+0

しかし、エラーが発生します:条件付きバインドの初期化子には、オプションの型が必要です。行に '[String?]'は含まれません:guard let posterStringArray = [genrePosters.results?[0] .poster] – SwiftyJD

+0

答えを編集しました。 –

関連する問題