swift - Swift:Realm 如何过滤 Int 包含数字作为字符串
问题描述
我有一个字符串输入“searchText”,如果 id(Int) 在“searchText”中包含任何数字,我需要检查领域过滤器
let searchText = "118523"
let messages:Results<ChatMessage> = realm
.objects(ChatMessage.self)
.filter("body CONTAINS %@ OR id CONTAINS %@" , searchText, searchText)
.sorted(byKeyPath: "timeStamp", ascending: true)
解决方案
据我了解,给定一组字符,OP 希望找到在 id(或正文)中包含任何这些字符的任何聊天消息。我将 body 排除在外,因为任何领域的模式都是相同的。
let searchText = "118523"
let charArray = Array(searchText) //casts each element to an Array of Characters
var predicateArray = [NSPredicate]()
for element in charArray {
let searchChar = String(element) //cast each Character to a string
let predicate = NSPredicate(format: "id CONTAINS %@", searchChar)
predicateArray.append(predicate)
}
let predicates = NSCompoundPredicate(orPredicateWithSubpredicates: predicateArray)
let results = realm.objects(ChatMessage.self).filter(predicates)
for msg in results {
print(msg)
}
解释
首先,searchText 被分解为单个字符并存储在一个数组中。
然后,使用循环,使用每个字符构建一个 NSPredicate 以查看 id 是否包含该字符。请注意,我们需要将 Swift Character 转换为要在谓词中使用的字符串。每个谓词都存储在谓词数组中。
然后这些谓词作为 OR 连接在一起成为一个 NSCompoundPredicate。
最后,我们为包含每个 Predicate 中的任何字符的任何 id 过滤领域 ChatMessage 对象,这将是“1”或“1”或“8”等。
如果我们使用 Set 而不是只存储唯一值的数组,这可能会更有效一些,例如过滤“1”或“1”没有意义——只有一个“1”就足够了。
推荐阅读
- angular - 如何在 ngx-slick-carousel 中处理来自 Angular 组件的轮播按钮
- fftw - 如何理解 fftw 基准测试?
- angular - 无法访问变量数据,也无法在 Angular Firestore 中返回它
- bash - 使用 for 循环 (bash_profile) 创建别名
- php - 图像上传到数据库未保存在目录中
- package - 无法在 systemverilog 中导出软件包
- powershell - 需要帮助从用户输入的数据中确定数字结构
- c++ - If 语句:将analogRead 与int 进行比较
- java - 将多个嵌套列表压缩在一起
- python - 在不使用 Pandas 或 Numpy 的情况下按 CSV 的字段计算寄存器数量