如何编写Realm Results对象扩展

时间:2016-04-20 10:26:12

标签: swift swift2 protocols extension-methods realm

我想写一个扩展,简化了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约束是不够的。

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

1 个答案:

答案 0 :(得分:2)

我认为这里的问题不是通用约束,但是你在这里使用的两个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")
    }
}