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

问题描述:

我想要做的是检索json数据(数组格式)并检查我的本地数组是否已经包含数据,如果它移动直到JSON数据中的下一个值,直到它们是数组不包含的值,然后将其附加到数组。数组中的这些数据必须按顺序排列。我试图做到这一点,但现在得到的错误:类型'customDataObject'不符合协议'序列'

Type 'ResultsGenrePosters' does not conform to protocol '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) 
    }) 
    } 

} 
+0

你的命名是一种单/复数混淆;-) – vadian

Alt +点击genrePosters?它告诉你吗?它应该说它的ResultsGenrePosters,因为那是什么错误说。现在看看posterArray的类型;它是一个String数组,而不是Array ResultsGenrePosters。我认为你的意思是写作为海报在genrePosters和混淆你自己的类型,因为你写了posterString在genrePosters

也许你想使用地图将genrePosters转换为[String]?

这将转换你的posterArray,如果它存在一个只包含海报名称的数组中。如果它不存在,你会得到一个空数组。这只适用于如果海报是字符串。如果它的字符串?你应该使用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

我编辑了答案。 –