gpt4 book ai didi

ios - 检查 Realm 列表属性是否包含另一个列表的所有元素

转载 作者:行者123 更新时间:2023-11-30 11:43:38 26 4
gpt4 key购买 nike

我正在使用 iOS/Swift 和 Realm,并且我有几个定义如下的 Realm 模型:

class Message: Object {

// other properties removed for brevity

var recipients = List<User>()
var acknowledgedBy = List<User>()

@objc dynamic var fullyAcknowledged = false
}

class User: Object {

@objc dynamic var id: Int = -1
@objc dynamic var name: String = ""

convenience init(id: Int, name: String) {
self.init()
self.id = id
self.name = name
}
}

我的消息对象有一个recipients 属性,该属性将保存此消息应发送到的用户列表。当用户收到消息时,他们会确认该消息,然后该用户将被添加到消息的 acknowledgedBy 列表中。每次将用户添加到 acknowledgedBy 列表中时,我都需要检查是否每个应该收到该消息的人都已确认该消息。当满足该条件时,我会将消息的 completeAcknowledged 属性设置为 true。

要检查消息是否已被所有人确认,我知道我可以遍历recipients中的每个用户,然后检查该用户是否也在acknowledgedBy列表中。我还认为我可以通过以下两步过程来完成此任务:

  1. 比较 recipientsacknowledgedBy 中的元素计数,确保它们相同;如果他们是……
  2. 对两个列表进行排序,然后比较它们以确定它们是否包含相同的用户

但我想知道是否有一种更有效的方法来确定一个列表包含另一个列表的所有元素(即使它们的顺序不同)?

编辑----------

看来我也可以使用 Sets 来做出这样的决定:

let ackSet = Set(message.acknowledgedBy)
let recipientSet = Set(message.recipients)
let fullyAcknowledged = ackSet.isSubset(of: recipientSet)

最佳答案

我认为集合不是一个好的选择,想象一下您在其中一个列表中有重复项,那么这是错误的选择。我强烈建议看看Testing for equality in Realm

如果User是唯一的,我会使用primaryKey https://realm.io/docs/swift/latest/#primary-keys 。然后,当您使用相同的 id 保存对象时,不会创建副本 => 您可以通过 Realm 的默认实现来比较此对象 ==

如果两个不同的用户可以有相同的 id,那么我会编写自己的方法,该方法需要 id 和名称相等。然后你可以使用 with [String: Int] 创建字典,这样你可能有以下代码

var dict = [String: Int]()
message.acknowledgedBy.forEach { user in
if let value = dict[user.name + "\(id)"] {
dict[user.name + "\(id)"] = value + 1
} else {
dict[user.name + "\(id)"] = 1
}
}
let isMatched = message.recipients.reduce(true) { (reducedValue, user) in
if let value = dict[user.name + "\(id)"] {
dict[user.name + "\(id)"] = value - 1
return (value - 1 >= 0) && reducedValue
} else {
return false
}
}

这是相当粗鲁的实现,但我想你会明白的

关于ios - 检查 Realm 列表属性是否包含另一个列表的所有元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49069994/

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