类型'customDataObject'不符合协议'Sequence'

时间:2017-02-03 18:31:55

标签: ios arrays swift

我要做的是检索json数据(以数组格式)并检查我的本地数组是否已经包含数据,如果它确实移动到JSON数据中的下一个值,直到它们为数组不包含的值然后将其附加到数组。数组中的数据必须按顺序排列。我现在正试图这样做,但得到错误:

  

类型'ResultsGenrePosters'不符合协议'序列'

这就是它的样子:

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

}

1 个答案:

答案 0 :(得分:0)

Alt +点击genrePosters,它告诉你什么?应该说它的ResultsGenrePosters,因为这就是错误所说的内容。现在看看posterArray的类型;它是一个String数组,而不是Array ResultsGenrePosters。我认为你的意思是在genrePosters 中写下的海报,并且因为你在genrePosters 中为posterString写了而对这些类型感到困惑。

也许您想使用map将genrePosters转换为[String]?

如果将posterArray存在于仅包含海报名称的数组中,则会将其转换。如果它不存在则会得到一个空数组。这只适用于海报是String的情况。如果它的字符串?你应该使用flatMap。

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