Насколько я понимаю, учитывая набор символов, 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".