【问题标题】:Classes or Structs for Models in SwiftSwift 中模型的类或结构
【发布时间】: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


【解决方案1】:

您不需要将现有的struct 更改为class 创建一个新的class 并创建一个接受struct 作为参数的初始化程序:

struct TalentDataModel: Decodable {
    let status : String?
    let error : String?
    let response : String?
}
class Talents: Decodable {
    var status : String?
    var error : String?
    var response : String?

    init(dataModel: TalentDataModel) {
        status   = dataModel.status
        error    = dataModel.error
        response = dataModel.response
    }
}

【讨论】:

  • 我仍然不清楚我应该如何在 VC 中为 IGListKit 使用它
【解决方案2】:

由于使用 here 所见的 srtucts 来制作服务模型需要大量工作

我更改了我的课程以使其与 IGListKit 一起使用。

import Foundation
import IGListKit


class Talents: NSObject,Decodable {
    let status : String
    let error : String
    let response : String

    init(status:String,error:String,response:String) {
        self.status   = status
        self.error    = error
        self.response = response
    }

}
extension NSObject: ListDiffable {
  public func diffIdentifier() -> NSObjectProtocol {
    return self
  }

  public func isEqual(toDiffableObject object: ListDiffable?) -> Bool {
    return isEqual(object)
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-04
    • 2018-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多