realm.objects().filter не работает с Resuts‹T›

Я пытался делать запросы к объектам из Realm, используя RealmSwift framefowk с предикатами:

realm.objects(Train).filter("ANY route IN %@", realm.objects(Route))

Ошибка:

Не удается вызвать «фильтр» со списком аргументов типа «(String, Results)»

Тот же код работал с Realm framework, но не работает с RealmSwift framework.

Что я делаю не так ?


person Valerii Solodovnyk    schedule 19.05.2015    source источник
comment
.objects это массив?   -  person gutenmorgenuhu    schedule 19.05.2015
comment
Я предполагаю, что проблема здесь заключается в том, что передача универсального типа при построении NSPredicate не подходит для компилятора.   -  person segiddins    schedule 22.05.2015


Ответы (3)


Проблема в том, что Results.filter(_:...) принимает аргументы типа (String, CVarArgType...), но Results не соответствует CVarArgType. Я только что создал выпуск GitHub #1995, чтобы отслеживать это. Исправление довольно простое, и я надеюсь, что вскоре у меня появится PR для решения этой проблемы.

Тем временем вы можете преобразовать аргументы Results и List в Results.filter(_:...) в Array, используя map(_:_:) следующим образом:

realm.objects(Train).filter("ANY route IN %@", map(realm.objects(Route)) { $0 })

EDIT: PR #1996 делает Results соответствующим CVarArgType сейчас находится на рассмотрении.

person jpsim    schedule 25.05.2015

В вашем случае результаты не рассматриваются как массив, вы можете сделать это просто с помощью этого фрагмента кода. Вы пытались отобразить realm.objects(Route), чтобы вернуть массив идентификаторов и отфильтровать его примерно так: ANY route.yourIdentifier IN %@?

person Vincent Saluzzo    schedule 19.05.2015
comment
realm.objects(Route) не имеет карты методов. Я не знаю, как отображать результаты из Realm ( - person Valerii Solodovnyk; 19.05.2015
comment
Вы можете создать его, просто создав расширение результатов с картой функций, которая возвращает массив результатов. Этот метод принимает закрытие в качестве параметра и добавляет результат этого закрытия для каждого результата в ваших результатах. Это можно сделать, потому что результаты перечисляются в RealmSwift;) - person Vincent Saluzzo; 19.05.2015

я написал это расширение

extension Results {
   func map<U>(transform: (T) -> U) -> Results<U> {
       return Results<U>(Swift.map(self, transform))
   }
}

но ошибка

'Results<U>' cannot be constructed because it has no accessible initializers

может быть потому, что результаты не могут быть созданы непосредственно в документах Realm.

person Valerii Solodovnyk    schedule 19.05.2015
comment
Это верно, Results невозможно построить напрямую вне RealmSwift — фреймворк предоставляет единственные способы получения результатов. - person segiddins; 20.05.2015