【发布时间】:2020-05-20 07:35:16
【问题描述】:
我想为我的 UICollectionView 实现 IgListKit。这个库要求我使用“类模型:ListDiffable”
根据我当前的架构,我有“结构模型:可解码”,因为我在 NetworkService 中使用 JSON 解码器来检索数据 我有 2 个结构,1 个用于 Root,2 个用于我的 Array。
struct Talents : Decodable {
let status : String?
let error : String?
let response : String?
}
struct Talent: Decodable {
let id: String
let name : String
let smallDesc: String
let largeDesc : String
}
\\I also have enum CodingKeys to match the keys for both structs
下面是Struct output,很好用在我的UICollectionView中
当我将这些结构更改为类时
class Talents : Decodable {
var status : String?
var error : String?
var response : String?
init( status : String,error : String, response : String){
self.status = status
self.error = error
self.response = response
}
}
这是我得到的Class Output,我不知道如何使用。
为了解决这个问题,我应该进行哪些更改,并将 ListDiffable 协议存根应用于我的模型类?
Service File 的实例在我的 CollectionVC 的 viewDidLoad 中我将数据放入数组中。
static func getCategoryTalents(category:String,completion: @escaping (Bool, [Talent]?, Error?) -> Void) {
let parameters: Parameters = [
"filter": category,
"shuffle": 1
]
AF.request(Constants.baseUrl,
parameters : parameters ).response { response in
guard let data = response.data else {
DispatchQueue.main.async {
print("\(Error.self)")
completion(false, nil, Error.self as? Error)
}
return}
do {
let talentsResponse = try JSONDecoder().decode(Talents.self, from: data)
print(talentsResponse)
let firstJSONString = talentsResponse.response?.replacingOccurrences(of: "\\", with: "")
let secondJSONString = firstJSONString?.replacingOccurrences(of: "\"{", with: "{").replacingOccurrences(of: "}\"", with: "}")
guard let talentArray = try! JSONDecoder().decode([Talent]?.self, from: (secondJSONString?.data(using: .utf8)!)!) else {
return }
print(talentArray)
var talents = [Talent]()
for talent in talentArray {
guard let individualTalent = talent as Talent? else { continue }
talents.append(individualTalent)
}
DispatchQueue.main.async {
completion(true, talents, nil)
}
} catch {
DispatchQueue.main.async {
completion(false, nil, error)
}
}
}
}
【问题讨论】:
-
我认为你不需要将模型转换为类,因为你可以使用 IGListKit 你总是可以使用 struct 看看github.com/Instagram/IGListKit/pull/1081
-
当您打印一个结构时,它会显示该结构的所有属性值。对于一个类来说,情况并非如此。如果要打印类的值,则需要该类实现 CustomStringConvertible 协议。此外,您需要扭转人才课程中的作业。设置self.status = status等
-
@RobertCarbtree 是的,我进行了编辑,我错误地进行了该分配。你能告诉我如何使用这个 forIGListKit 吗?
标签: swift class uicollectionview uicollectionviewcell iglistkit