Dire che ho un array di AnyObject
.Filtraggio di una matrice Swift [AnyObject] per tipo
let grabBag: [AnyObject] = [ "Tom", 4, "Dick", NSObject(), "Harry" ]
e voglio lanciare a una serie di Strings
, estraendo solo quegli elementi che sono in realtà Strings
. Mi aspetterei questo lavoro:
let strings = grabBag.filter{ $0 is String } as! [String] // 1
ma dà l'errore 'Bool' is not convertible to 'String'
. Eppure, questo funziona:
let definitelyStrings = grabBag.filter{ $0 is String } // 2
let strings = definitelyStrings as! [String] //
Perché 2
lavoro quando 1
non lo fa? E c'è un modo più semplice (rispetto allo 2
) di estrarre e trasmettere gli elementi di un [AnyObject]
a qualsiasi [T]
?
Nell'esempio 2 non è necessaria la seconda riga: 'let strings = grabBag.filter {$ 0 is String}' è sufficiente. Nessun casting forzato. Dimostralo con 'strings is [String]' che restituisce true – vadian
@vadian 'let strings = grabBag.filter {$ 0 is String}' restituisce '[AnyObject]' con l'array 'grabBag' di OP, non' [String] '. – Moritz
@EricD: Ma puoi fare 'grabBag.filter {$ 0 is String} .map {$ 0.lowercaseString}' che normalmente non è possibile con '[AnyObject]' – vadian