Swift: Realm Как фильтровать Int содержит число в виде строки - PullRequest
0 голосов
/ 09 июля 2020

У меня есть строковый ввод «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)

1 Ответ

0 голосов
/ 12 июля 2020

Насколько я понимаю, учитывая набор символов, OP хочет найти любые сообщения чата, которые имеют любой из этих символов в идентификаторе (или теле). Я оставляю тело, поскольку шаблон одинаков для любого поля.

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 разбивается на отдельные символы и сохраняется в массиве.

Затем, используя al oop, создается NSPredicate с использованием каждого символа, чтобы увидеть, содержит ли идентификатор этот символ. Обратите внимание, что нам нужно преобразовать Swift Character в строку, которая будет использоваться в предикате. Каждый предикат хранится в массиве предикатов.

Затем все эти предикаты объединяются как OR в NSCompoundPredicate.

Наконец, мы фильтруем объекты ChatMessage области для любых идентификаторов, которые СОДЕРЖАТ любые символы внутри каждый предикат, который может быть «1», «1» или «8» и т.д. c.

Это могло бы быть немного более эффективным, если бы мы использовали Set вместо Array, который будет хранить только уникальные значения например, нет смысла фильтровать "1" или "1" - достаточно одной "1".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...