我要做的是检索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)
})
}
}
答案 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]()