将NSArray转换为Swift Array <T>并过滤掉与T不匹配的元素

fab*_*abb 3 casting objective-c nsarray ios

如果所有元素都已经是类型,那么转换NSArray为Swift Array类型T很容易T:

let arr1 : NSArray = [1,2,3]
let arr2 = arr1 as? Array<Int> // works
Run Code Online (Sandbox Code Playgroud)

但现在假设一个非同质NSArray的对象不匹配T:

let arr1 : NSArray = [1,2,3,"a"]
let arr2 = arr1 as? Array<Int> // nil, as not all elements are of type Int
Run Code Online (Sandbox Code Playgroud)

我试图实现的是向下过滤掉所有不匹配的元素T.所以在上面的例子中我想得到一个只Array<Int>包含对象的东西[1,2,3].

如何优雅地做到这一点?

Jak*_*ano 6

凝结:

let arr1 : NSArray = [1,2,3,"a"]
let arr2 = (arr1 as Array<AnyObject>).filter { $0 is Int } as! Array<Int>
Run Code Online (Sandbox Code Playgroud)

一步步:

let arr2 = arr1 as Array<AnyObject>  // convert NSArray to Array of AnyObject
let arr3 = arr2.filter { $0 is Int } // keep only objects that are of type Int
let arr4 = arr3 as! Array<Int>       // force cast to Array<Int>, as now you know that all objects are of that type 
Run Code Online (Sandbox Code Playgroud)