gpt4 book ai didi

swift - 如何防止在 Swift 中重复实例化对象(通过其唯一 ID)?

转载 作者:行者123 更新时间:2023-11-28 13:52:15 24 4
gpt4 key购买 nike

我的程序管理任务对象。每个 Task 对象都有一个唯一的“taskID”。

类是:

class Task: Codable, Equatable {
var taskID: Int64
// ... plus other variables

static func == (left: Task, right: Task) -> Bool {
return left.taskID == right.taskID
}
}

在成功的 RESTful 调用后,任务对象由 JSONDecoder 实例化,如下所示:

try JSONDecoder().decode([Task].self, from: jsonData!)

...并放入不同的数组和字典中。

程序的不同部分将调用不同的 RESTful 方法并检索相同的 Task 对象(我定义的 Tasks 对象是相同,具有相同“taskID”)。问题是代码不知道存在的其他相同任务对象存储在不同的数组或字典中。

需要的解决方案:

我需要实现它,因此每个唯一的“taskID”只有 1 个 Task 对象。这意味着不能有超过 1 个具有相同“taskID”的相同任务的副本

(不是单例,因为有很多唯一的Task对象。)

为了更清楚地解释这一点:我的程序使用 RESTful 方法检索以 JSON 格式返回的数据。每个对象(即任务)应该只有 1 个副本,由存储在整个程序中的“taskID”标识。如果之前已经创建了 Task 对象,则不应重新创建它。所有数组和字典都应指向相同的任务对象。

最简单的解决方案是什么? (我正在考虑一些方法来覆盖 init() 方法......)我该怎么做?

谢谢!

最佳答案

好吧,当在创建相同对象之前可以进行比较时,我创建了这种类型的扩展。

您有多个 Task 对象,因此我们将创建 Array 的扩展,遍历创建的任务对象并使用它们的 taskID 进行比较。

extension Array where Element: Task {
internal static func decode(_ json: Data) throws -> [Task] {
let jsonDecoder = JSONDecoder()
var arrTasks: [Task] = []
if let jsonObject = (try? JSONSerialization.jsonObject(with: json, options: [])) as? Array<Any> {
for json in jsonObject {
if let data = try? JSONSerialization.data(withJSONObject: json, options: []), let task = (try? jsonDecoder.decode(Task.self, from: data)) {
if !arrTasks.contains(task) {
arrTasks.append(task)
}
}
}
}
return arrTasks
}
}

用法:

if let tasks = try? [Task].decode(data) {
//Other Stuffs...
}

让我知道这是否有帮助!

关于swift - 如何防止在 Swift 中重复实例化对象(通过其唯一 ID)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54396346/

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