Строки фильтра областей с различными разделами табличного представления - PullRequest
0 голосов
/ 15 декабря 2018

У меня есть табличное представление с максимум 27 разделами (AZ + #)

Раздел A содержит все объекты, имя которых начинается с "A" и т. Д. Мои объекты в этом случае имеют тип Artistи имеют свойство name.

private var sectionIndices: [String] = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","#"]

for beginningLetter in self.sectionIndices {
  print("Finding artists for \(beginningLetter)")
  let artists: Results<Artist>
  if beginningLetter == "#" {
    artists = self.artists.filter("NOT (name[0] IN %@)", self.sectionIndices)
  } else {
    artists = self.artists.filter("name BEGINSWITH[cd] %@", beginningLetter).sorted(byKeyPath: "name", ascending: true)
  }
}

Так что фильтрация отлично работает для всего, кроме раздела #.По сути, каждый артист, имя которого начинается с неалфавитной буквы, должен быть там.«21 Savage», «6ix9ine», «2 Pac» и т. Д.

Спички по какой-то причине не работают, я пробовал

name MATCHES %@, но область на самом деле не поддерживает это.

Я ищу фильтр, который дает мне такое поведение - оператор IN на name[0] также не работает (и неэффективен).

Любая помощь приветствуется, спасибо!

1 Ответ

0 голосов
/ 17 декабря 2018

К сожалению, Realm действительно не поддерживает MATCHES оператор NSPredicate.Одним из возможных решений для вашей конкретной проблемы является использование оператора BEGINSWITH со всеми возможными однозначными числами и создание составного предиката, используя OR s со всеми цифрами.

let startsWithNumberPredicate = NSPredicate(format: "name BEGINSWITH '0' OR name BEGINSWITH '1' OR name BEGINSWITH '2' OR name BEGINSWITH '3' OR name BEGINSWITH '4' OR name BEGINSWITH '5' OR name BEGINSWITH '6' OR name BEGINSWITH '7' OR name BEGINSWITH '8' OR name BEGINSWITH '9'")

Тогда вам просто нужно использовать этоstartsWithNumberPredicate в случае beginningLetter == "#", чтобы найти все Artist s, свойство name которых начинается с числа.

private var sectionIndices: [String] = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","#"]

for beginningLetter in self.sectionIndices {
  print("Finding artists for \(beginningLetter)")
  let artists: Results<Artist>
  if beginningLetter == "#" {
    artists = self.artists.filter(startsWithNumberPredicate, self.sectionIndices)
  } else {
    artists = self.artists.filter("name BEGINSWITH[cd] %@", beginningLetter).sorted(byKeyPath: "name", ascending: true)
  }
}
...