Angenommen, ich habe ein Array von AnyObject
.Filtern eines Swift [AnyObject] Arrays nach Typ
let grabBag: [AnyObject] = [ "Tom", 4, "Dick", NSObject(), "Harry" ]
und ich möchte es auf ein Array von Strings
werfen, nur diejenigen Elemente, die das Extrahieren Strings
tatsächlich. Ich würde erwarten, dies funktioniert:
let strings = grabBag.filter{ $0 is String } as! [String] // 1
aber es gibt den Fehler 'Bool' is not convertible to 'String'
. Doch dies funktioniert:
let definitelyStrings = grabBag.filter{ $0 is String } // 2
let strings = definitelyStrings as! [String] //
Warum 2
Arbeit, wenn 1
nicht? Und gibt es eine einfachere (als 2
) Art und Weise, die Elemente eines [AnyObject]
zu einem beliebigen [T]
zu extrahieren und zu gießen? Diese
In Beispiel 2 brauchen Sie nicht die zweite Zeile: 'let strings = grabBag.filter {$ 0 ist String}' ist ausreichend. Kein erzwungenes Gießen. Man beweise es mit 'strings is [String]', was true zurückgibt – vadian
@vadian 'let strings = grabBag.filter {$ 0 ist String}' '' 'AnyObject]' mit OPs 'grabBag' Array zurück, nicht' [String] '. – Moritz
@EricD: Aber du kannst 'grabBag.filter {$ 0 ist String} .map {$ 0lowercaseString}' was normalerweise nicht mit '[AnyObject]' – vadian