You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中Realm如何筛选包含指定数字字符串的Int类型id

解决Realm中Int类型id匹配字符串数字的问题

嘿,我一眼就看到你代码里的问题啦——Realm的CONTAINS操作符只能作用于字符串类型的属性,而你的id是Int类型,直接这么写要么会报错,要么根本得不到正确的筛选结果。下面分两种常见需求给你对应的解决方案:

需求1:id的字符串形式包含完整的searchText

如果你想匹配的是id转成字符串后包含整个searchText(比如searchText是"185",id=118523就算匹配),可以用Realm内置的string()函数把Int类型的id转成字符串,再用CONTAINS:

let searchText = "118523"
let messages: Results<ChatMessage> = realm
    .objects(ChatMessage.self)
    .filter("body CONTAINS %@ OR string(id) CONTAINS %@", searchText, searchText)
    .sorted(byKeyPath: "timeStamp", ascending: true)

这个方法简单直接,适合需要完整匹配子串的场景。

需求2:id包含searchText中的任意单个数字

如果你的真实需求是id只要包含searchText里的任意一个数字(比如searchText是"118523",id=12、89、50这类都算匹配),那需要先提取searchText里的唯一数字,再构建多条件OR筛选:

let searchText = "118523"
// 先收集筛选条件,默认包含body的匹配
var filterConditions = ["body CONTAINS %@"]

// 提取searchText中的唯一数字字符,避免重复条件
let uniqueDigits = Set(searchText).filter { $0.isNumber }
if !uniqueDigits.isEmpty {
    // 为每个数字构建id的匹配条件
    let idMatchConditions = uniqueDigits
        .map { "string(id) CONTAINS '\($0)'" }
        .joined(separator: " OR ")
    filterConditions.append("(\(idMatchConditions))")
}

// 组合最终的筛选条件
let finalFilter = filterConditions.joined(separator: " OR ")

// 执行筛选
let messages: Results<ChatMessage> = realm
    .objects(ChatMessage.self)
    .filter(finalFilter, searchText)
    .sorted(byKeyPath: "timeStamp", ascending: true)

这样处理的好处是:

  • 自动去重重复的数字,避免生成冗余的筛选条件
  • 边界情况处理:如果searchText里没有数字,只会筛选body包含searchText的结果,不会出错

内容的提问来源于stack exchange,提问作者Sabrysoft

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 11:47:48