Ios 类型';customDataObject';不符合协议';序列';

Ios 类型';customDataObject';不符合协议';序列';,ios,arrays,swift,Ios,Arrays,Swift,我试图做的是检索json数据(以数组格式),检查我的本地数组是否已经包含数据,如果它确实移动到json数据中的下一个值,直到它们是数组不包含的值,然后将其附加到数组中。数组中的此数据必须有序。我正在尝试执行此操作,但出现错误: 类型“ResultsGenrePosters”不符合协议“Sequence” 这就是它看起来的样子: public struct ResultsGenrePosters: Decodable { public let results : [GenrePosters

我试图做的是检索json数据(以数组格式),检查我的本地数组是否已经包含数据,如果它确实移动到json数据中的下一个值,直到它们是数组不包含的值,然后将其附加到数组中。数组中的此数据必须有序。我正在尝试执行此操作,但出现错误:

类型“ResultsGenrePosters”不符合协议“Sequence”

这就是它看起来的样子:

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

}
公共结构resultsgenereposter:可解码{
公开出租结果:[GenrePosters]?
公共init?(json:json){

results=“results”Alt+点击genrePosters,它会告诉你什么?它应该说它的ResultsGenrePosters,因为这就是错误所说的。现在看看posterArray的类型;它是字符串数组,而不是数组ResultsGenrePosters。我想你的意思是在genrePosters中为poster编写,并且对类型感到困惑在genrePosters中为posterString使用您编写的

也许您想使用map将genreposter转换为[字符串]

这会将posterArray(如果存在)转换为仅包含海报名称的数组。如果不存在,则会得到一个空数组。这仅在海报为字符串时有效。如果是字符串,则应使用flatMap

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

我明白你的意思了,我试过这样做:guard let posterStringArray=[genrePosters.results?[0].poster]else{print(“没有这样的项目”)return}对于posterStringArray中的海报{if posterArray.contains(posterString){continue}else{posterArray.append(posterString)}//这就是错误发生的地方}但是得到一个错误:条件绑定的初始值设定项必须具有可选类型,而不是行上的“[String?]”:guard let posterStringArray=[genrePosters.results?[0]。poster]它抛出错误:无法对“[String]类型的非可选值使用可选链接“有了这行代码,我不知道Genreposter是如何定义的。你必须看看定义,找出正确的转换。你的命名有点单数/复数混淆;-)