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