首页 > 解决方案 > 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)

标签: swiftrealm

解决方案


据我了解,给定一组字符,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”就足够了。


推荐阅读