2016-04-20 2 views
0

Resultsオブジェクトの複雑なフィルタリングを簡略化する拡張を書きたいと思います。私はこれを試してみました:Ambiguous reference to member 'filter'レルム結果オブジェクトエクステンションの書き方

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

Xcodeは私にこのエラーが発生します。私はT:MyProtocolの制約が十分ではないと思う。

私は何をしようとしていますか?

答えて

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") 
    } 
} 
+0

2番目の部分では、はるかに複雑なフィルタを実行していました。質問のために単純化しました。とにかくありがとう。戻り値の型を修正しても、エラーは修正されませんでした。もう一つのエラーは '$ 0'は' enabled'プロパティを持っていませんでした。 「あまり関係のない」エラーメッセージを修正するには、両方を修正する必要がありました。 Xcodeは最初に "$ 0は有効になっていませんでした"とし、その後 "戻り値の型が一致しません" – osrl

+0

ああ、大丈夫です。ちょうどあなたがその意味を認識していることを確認したかったのです。そのような場合には、式を分割して明示的な型を宣言することによってSwiftコンパイラにヒントを与えることがよくありますが、それは退屈なことがあります。 – marius

+0

はい、面倒です。彼らはいつかこれらを修正することを願っています – osrl