- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 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
列表中。我还认为我可以通过以下两步过程来完成此任务:
recipients
和 acknowledgedBy
中的元素计数,确保它们相同;如果他们是……但我想知道是否有一种更有效的方法来确定一个列表包含另一个列表的所有元素(即使它们的顺序不同)?
编辑----------
看来我也可以使用 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/
你能比较一下属性吗 我想禁用文本框“txtName”。有两种方式 使用javascript,txtName.disabled = true 使用 ASP.NET, 哪种方法更好,为什么? 最佳答案 我
Count 属性 返回一个集合或 Dictionary 对象包含的项目数。只读。 object.Count object 可以是“应用于”列表中列出的任何集合或对
CompareMode 属性 设置并返回在 Dictionary 对象中比较字符串关键字的比较模式。 object.CompareMode[ = compare] 参数
Column 属性 只读属性,返回 TextStream 文件中当前字符位置的列号。 object.Column object 通常是 TextStream 对象的名称。
AvailableSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。 object.AvailableSpace object 应为 Drive 
Attributes 属性 设置或返回文件或文件夹的属性。可读写或只读(与属性有关)。 object.Attributes [= newattributes] 参数 object
AtEndOfStream 属性 如果文件指针位于 TextStream 文件末,则返回 True;否则如果不为只读则返回 False。 object.A
AtEndOfLine 属性 TextStream 文件中,如果文件指针指向行末标记,就返回 True;否则如果不是只读则返回 False。 object.AtEn
RootFolder 属性 返回一个 Folder 对象,表示指定驱动器的根文件夹。只读。 object.RootFolder object 应为 Dr
Path 属性 返回指定文件、文件夹或驱动器的路径。 object.Path object 应为 File、Folder 或 Drive 对象的名称。 说明 对于驱动器,路径不包含根目录。
ParentFolder 属性 返回指定文件或文件夹的父文件夹。只读。 object.ParentFolder object 应为 File 或 Folder 对象的名称。 说明 以下代码
Name 属性 设置或返回指定的文件或文件夹的名称。可读写。 object.Name [= newname] 参数 object 必选项。应为 File 或&
Line 属性 只读属性,返回 TextStream 文件中的当前行号。 object.Line object 通常是 TextStream 对象的名称。 说明 文件刚
Key 属性 在 Dictionary 对象中设置 key。 object.Key(key) = newkey 参数 object 必选项。通常是 Dictionary 
Item 属性 设置或返回 Dictionary 对象中指定的 key 对应的 item,或返回集合中基于指定的 key 的&
IsRootFolder 属性 如果指定的文件夹是根文件夹,返回 True;否则返回 False。 object.IsRootFolder object 应为&n
IsReady 属性 如果指定的驱动器就绪,返回 True;否则返回 False。 object.IsReady object 应为 Drive&nbs
FreeSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。只读。 object.FreeSpace object 应为 Drive 对象的名称。
FileSystem 属性 返回指定的驱动器使用的文件系统的类型。 object.FileSystem object 应为 Drive 对象的名称。 说明 可
Files 属性 返回由指定文件夹中所有 File 对象(包括隐藏文件和系统文件)组成的 Files 集合。 object.Files object&n
我是一名优秀的程序员,十分优秀!