数据键针对不同类型而更改,我只想将此TableView单元格用于不同类型。我不想为每种类型创建新的tableview单元格。可能吗?我想我应该使用泛型,但是如何解决这个问题呢?

我有一个自定义的UITableViewCell,其中包括

@IBOutlet weak var nameLabel: UILabel!
@IBOutlet weak var departmentLabel: UILabel!
@IBOutlet weak var genderLabel: UILabel!


{ "data": [ { "type": "employee", "data": { "name": "Michael", "department": "HR", "gender": "Male" } }, { "type": "employer", "data": { "name": "Julia", "division": "Finance", "sex": "Female" } } ]}

最佳答案

如果我理解您的问题,则希望采用不同形式但在同一数组中返回的数据可以在单个表视图单元格中表示。这绝对是可行的,挑战在于将变量JSON响应解析为可以发送到要显示的单元格的一致内容。

使用Codable的自定义实现可能会发生这种情况。需要注意的是,您将需要知道该数据可能涉及的哪种选择(例如,性别始终是“性别”还是“性别”?)

一个例子是:

struct CompanyPersonContainer: Decodable {
    var data: [CompanyRelatedPerson]

    enum CodingKeys: String, CodingKey {
        case data
    }

    public init(from decoder: Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        data = []

        if var dataContainer = try? values.nestedUnkeyedContainer(forKey: CodingKeys.data) {
            while !(dataContainer.isAtEnd) {
                let companyPerson: CompanyRelatedPerson

                if let employee = try dataContainer.decodeIfPresent(Employee.self) {
                    companyPerson = employee
                } else if let employer = try dataContainer.decodeIfPresent(Employer.self) {
                    companyPerson = employer
                } else {
                    fatalError() // You need to know the total possible values you'll be decoding
                }

                data.append(companyPerson)
            }
        }
    }
}

protocol CompanyRelatedPerson: Codable  {
    var name: String { get set }
    var department: String { get set }
    var gender: String { get set }
}

struct Employee: Codable, CompanyRelatedPerson {
    var name: String
    var department: String
    var gender: String
}

struct Employer: Codable, CompanyRelatedPerson {
    var name: String
    var department: String
    var gender: String

    enum CodingKeys: String, CodingKey {
        case name
        case department = "division"
        case gender = "sex"
    }
}

关于swift - 具有不同数据类型的通用UITableViewCell,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57332792/

10-09 07:02
查看更多