【问题标题】:realm.objects().filter does not work with Resuts<T>realm.objects().filter 不适用于 Resuts<T>
【发布时间】:2015-07-31 00:54:38
【问题描述】:

我尝试使用带有谓词的 RealmSwift framefowk 从 Realm 查询对象:

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

错误是:

不能使用类型为 '(String, 结果)'

相同的代码适用于Realm framework,但不适用于RealmSwift framework

我做错了什么?

【问题讨论】:

  • .objects 是一个数组吗?
  • 我的直觉是,这里的问题是在构造 NSPredicate 时传递泛型类型对于编译器来说是不行的。

标签: swift realm


【解决方案1】:

问题是Results.filter(_:...) 接受(String, CVarArgType...) 类型的参数,但Results 不符合CVarArgType。我刚刚创建了 GitHub 问题 #1995 来跟踪它。修复非常简单,我希望尽快提交 PR 来解决这个问题。

与此同时,您可以像这样使用map(_:_:)ResultsList 参数转换为Results.filter(_:...)Array

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

编辑: PR #1996 使 Results 符合 CVarArgType 正在等待审核。

【讨论】:

    【解决方案2】:

    我写了这个扩展

    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 文档创建结果。

    【讨论】:

    • 没错,Results 不能在RealmSwift 之外直接构造——框架提供了获取结果的唯一方法。
    【解决方案3】:

    在你的情况下,结果并不像数组一样考虑周到,你可以用这段代码简单地做到这一点。您是否尝试过映射 realm.objects(Route) 以返回标识符数组并使用以下内容对其进行过滤:ANY route.yourIdentifier IN %@

    【讨论】:

    • realm.objects(Route) 没有方法映射。我不知道如何从领域映射结果(
    • 您可以创建它,只需使用返回结果计数数组的函数映射创建结果扩展。此方法将闭包作为参数,并为结果中的每个结果附加此闭包的结果。可以这样做,因为结果在 RealmSwift 中是可枚举的;)
    猜你喜欢
    • 2020-03-19
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-31
    • 2018-02-17
    相关资源
    最近更新 更多