【问题标题】:How to write a Realm Results object extension如何编写 Realm Results 对象扩展
【发布时间】:2016-04-20 10:26:11
【问题描述】:

我想编写一个扩展来简化对我的Results 对象的复杂过滤。我试过这个:

extension Results where T:MyProtocol {
    func filterEnabled() -> MyProtocol {
        return self.filter("type == 1").filter { $0.enabled == true }
    }
}

XCode 给我这个错误:Ambiguous reference to member 'filter'。我认为T:MyProtocol 约束是不够的。

我怎样才能完成我想做的事情?

【问题讨论】:

    标签: swift swift2 protocols extension-methods realm


    【解决方案1】:

    我认为这里的问题不是通用约束,而是您在此处使用的 filter 方法都返回一个集合,该集合与您指定的返回类型不匹配。

    还有一点需要注意:您应用的第一个过滤器可以由 Realm 在内部进行优化以查询您的数据库,后者是 Swift 标准库的一部分,在过滤它们之前先将所有对象拉入内存。

    extension Results where T: Named {
        func firstEnabled() -> Named? {
            return self.filter("type == 1 && enabled == true").first
        }
    
        func filterEnabled() -> Results<T> {
            return self.filter("type == 1 && enabled == true")
        }
    }
    

    【讨论】:

    • 我在第二部分做了一个更复杂的过滤器。只是为这个问题简化了它。不管怎么说,还是要谢谢你。修复返回类型并不能修复错误。另一个错误是$0 没有enabled 属性。两者都必须修复以修复“相关性低得多”的错误消息。 XCode 应该首先给我“$0 没有启用”,然后是“返回类型不匹配”
    • 哦,好吧,有道理。只是想确保您了解其中的含义。在这种情况下,通过拆分表达式并声明显式类型来提示 Swift 编译器通常会有所帮助,但这可能很乏味。
    • 是的,这很乏味。希望他们有一天能解决这些问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-17
    • 2018-08-19
    • 1970-01-01
    相关资源
    最近更新 更多