2016-06-03 19 views
3

ich eine Caching-Array haben, die verschiedene Arten von Objekten wie UIViews speichern kann, UICollectionReuableView, etcSwift Generics: Benutzerdefinierte Verschluss mit mehreren Argumenten für Filterfunktion

var arrCache    = [AnyObject]() 

Ich möchte diese spezifischen Elemente herauszufiltern eingebaut Verwendung Filterfunktion durch einen benutzerdefinierten Verschluss wie folgt übergeben:

private func reusableViewsClosure<T where T: Equatable>(element : AnyObject, type: T) -> Bool { 
    return element is T ? true : false 
} 

Nun, wenn ich diesen Verschluss auf der Filterfunktion aufrufen, erhalte ich eine Fehlermeldung,

 let i = arrCache.filter(reusableViewsClosure(UIView)) 

// Fehler: Aufruf Ergebnistyp bool zu erwarteten Typ ‚(@noescape (ANYOBJECT) wirft -> Bool)‘ konvertieren kann nicht

Nur frage mich, ob es erlaubt ist, passieren zusätzliche Parameter für Verschlüsse für verwendet gebaut in Funktionen wie Karte, flatmap, Filter, etc, denn wenn ich die gleiche Funktion wie das unten nennen, funktioniert es ganz gut:

private func reusableHeaderViewsClosure(element : AnyObject) -> Bool { 
    return element is UICollectionReusableView ? true : false 
} 
... 
let i = arrCache.filter(reusableHeaderViewsClosure) 
+0

Was ist 'reusableViewsClosure (UIView)' versuchen zu erreichen? – jtbandes

+0

'reusableViewsClosure (UIView)' ist eigentlich eine generische Closure zum Ausfiltern von Elementen basierend auf dem angegebenen Typ, in diesem Fall UIView. Ich wollte auch UICollectionReusableView auf die gleiche Funktion übergeben, um Code-Duplizierung zu vermeiden –

+0

Aber wenn Sie 'wiederverwendbareViewsClosure (UIView)' schreiben, versucht es, die Funktion aufzurufen. – jtbandes

Antwort

1

im Moment Syntax für diesen Fall wie folgt aussehen:

let i = arrCache.filter { reusableViewsClosure($0, UIView) } 

oder ein wenig mehr beschreibend:

let i = arrCache.filter { object in 
    return reusableViewsClosure(object, UIView) 
} 

Ich ziehe es erste Option für seine kompakte Größe. Wenn Sie wirklich die Syntax verwenden möchten, können Sie eine werkseitige Rückgabe erstellen (currying der Funktion).

func factory<T where T: Equatable>(type: T.Type) -> (AnyObject -> Bool) { 
    return { reusableViewsClosure($0, type) } 
} 

damit Sie es für Filter verwenden:

let i = arrCache.filter (factory(UICollectionView)) 
Verwandte Themen