2016-04-20 8 views
0

Ich möchte eine Erweiterung schreiben, die eine komplexe Filterung auf meinem Results Objekt vereinfacht. Ich versuchte dies:Wie schreibe ich eine Realm Results Objekt Erweiterung

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

XCode gibt mir diese Fehlermeldung: Ambiguous reference to member 'filter'. Ich denke, T:MyProtocol Einschränkung ist nicht genug.

Wie kann ich erreichen, was ich versuche?

Antwort

2

Ich denke, das Problem hier ist nicht die generische Einschränkung, aber dass beide filter Methoden, die Sie hier verwenden, eine Auflistung zurückgeben, die nicht mit dem angegebenen Rückgabetyp übereinstimmt.

Das ist auch wichtig zu beachten: Der erste von Ihnen angewendete Filter kann intern von Realm zur Abfrage Ihrer Datenbank optimiert werden. Letztere ist Teil der Swift-Standardbibliothek und zieht zuerst alle Objekte in den Speicher, bevor sie gefiltert werden.

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

Ich machte einen viel komplizierteren Filter auf den zweiten Teil. Einfach für die Frage vereinfacht. Danke trotzdem. Durch das Korrigieren des Rückgabetyps wurde der Fehler nicht behoben. Ein weiterer Fehler war, dass '$ 0' keine 'enabled' Eigenschaft hatte. Beides musste behoben werden, um die "viel weniger verwandte" Fehlermeldung zu beheben. XCode sollte mir zuerst geben "$ 0 hatte nicht aktiviert", und danach "Rückgabetyp passt nicht" – osrl

+0

Oh okay, macht sene. Ich wollte nur sicher sein, dass Sie sich der Implikationen bewusst sind. In solchen Fällen hilft es oft, den Swift-Compiler anzudeuten, indem Sie den Ausdruck aufteilen und explizite Typen deklarieren, aber das kann mühsam sein. – marius

+0

Ja, es ist langweilig. Hoffentlich werden sie diese eines Tages beheben – osrl

Verwandte Themen