gpt4 book ai didi

ios - 将通用可编码类型作为参数传递给保存到 Realm 的方法

转载 作者:行者123 更新时间:2023-11-30 11:02:31 25 4
gpt4 key购买 nike

我正在尝试创建一个通用方法来解码一些 JSON 数据。我需要将 JSON 数据转换为对象以便稍后保存在 Realm 中。

例如:获取车辆的品牌、型号、颜色和车身类型。

在我的每个 JSON 调用中,结果的格式完全相同(请参阅问题末尾的我的结构)。为了简洁起见,我只向您展示品牌和型号,但颜色和车身类型完全相同,只是名称发生了变化。

我目前有四种调用的方法,其中 Makes.self 被替换为其他结构之一。

if let results = try? JSONDecoder().decode(Makes.self, from: jsonData)) {
DispatchQueue.main.async {
//save data to realm
self?.save(objects: results.data )
}
}

获得 JSON 数据后,我想将数据发送到通用方法进行处理。

所以我可以这样称呼:

process(jsonData, modelType: Makes.self)
process(jsonData, modelType: Models.self)
process(jsonData, modelType: Colors.self)
process(jsonData, modelType: Bodies.self)

我尝试过泛型类型的变体,但我似乎无法做到正确。

func process<T:Codable>(_ jsonData: Data, modelType: T.Type = T.self) {

if let results = try? JSONDecoder().decode(modelType.self, from: jsonData) {
DispatchQueue.main.async {
//save data to realm
self?.save(objects:results.data)
}
}
}

如何将可解码协议(protocol)类型作为泛型传递?

制造

import RealmSwift

struct Makes: Codable {
let result: String
let data: [Make]

enum CodingKeys: String, CodingKey {
case result = "Result"
case data = "Data"
}
}

class Make: Object, Codable {
@objc dynamic var key: String
@objc dynamic var value: String
@objc dynamic var shortCode: String
@objc dynamic var active: Bool

enum CodingKeys: String, CodingKey {
case key = "Key"
case value = "Value"
case shortCode = "ShortCode"
case active = "Active"
}
}

模型

import RealmSwift

struct Makes: Codable {
let result: String
let data: [Make]

enum CodingKeys: String, CodingKey {
case result = "Result"
case data = "Data"
}
}

class Make: Object, Codable {
@objc dynamic var key: String
@objc dynamic var value: String
@objc dynamic var shortCode: String
@objc dynamic var active: Bool

enum CodingKeys: String, CodingKey {
case key = "Key"
case value = "Value"
case shortCode = "ShortCode"
case active = "Active"
}
}

最佳答案

为什么您期望任何 Codable 类型都具有 data 属性? results.data 无法工作...您需要将 T 设为 Object 的子类才能将其保存到 Realm 以及 Decodable 以便能够将其传递给 decode 方法。

func process<T:Object>(_ jsonData: Data, modelType: T.Type) where T:Decodable {
if let results = try? JSONDecoder().decode(modelType.self, from: jsonData) {
DispatchQueue.main.async {
//save data to realm
self?.save(objects:results)
}
}
}

关于ios - 将通用可编码类型作为参数传递给保存到 Realm 的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53162319/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com