一个数组可以被select性地向下转换为一个types特定的数组?

我正在阅读Swift文档,查看关于types转换的部分。

这个文档讲述了如何从Foundation框架中获取一个[AnyObject]types的数组(什么是Objective-C中的NSArray * )。

首先,文档提供了这个例子:

 for object in someObjects { let movie = object as Movie println("Movie: '\(movie.name)', dir. \(movie.director)") } 

现在,我想稍微改变一下例子,我不知道所有的对象都是Movietypes,所以我会这样做:

 for object in someObject { if let movie = object as? Movie { println("Movie: '\(movie.name', dir. \(movie.director)") } } 

文档然后提供了一个更好的写第一个循环的例子:

 for movie in someObjects as [Movie] { println("Movie: '\(movie.name)', dir. \(movie.director)") } 

我们将[AnyObject][AnyObject][Movie]所以我们不必在循环中[AnyObject]

这让我想到,整个arrays可以被select性地降低吗?

 if let someMovies = someObjects as? [Movie] { for movie in someMovies { println("Movie: '\(movie.name)', dir. \(movie.director)") } } 

这是否工作? 如果是这样,从性能angular度来看,这有多糟? 使用可选的downcast来检查10,000元素数组中每个对象的types需要多长时间?

我知道这段代码和我以前的可选downcast代码片段之间的含义是不同的。 第一个将遍历每个对象,只试图打印如果对象是一个Movie ,其中第二个将只进入循环,如果数组可以向下转换到[Movie]数组,在这种情况下,它将打印全部或无,但我可以想象有些情况下,这将是可取的。

你已经得到了它 – 它的工作原理就像你的示例代码:

 let strings = ["Hi", "Hello", "Aloha"] let anyObjects: [AnyObject] = strings if let downcastStrings = anyObjects as? [String] { println("It's a [String]") } // console says "It's a [String]" 

不知道性能,但我不会认为它将不得不遍历整个数组,以确定是否可以downcast。


所以我很好奇,在一个不同的[AnyObject]configuration中运行了100,000个简单值的快速testing,在这里我试图将数组向下转换为[String]与向下转换单个元素:

 // var anyObjects: [AnyObject] = [AnyObject]() // filled with random assortment of Int, String, Double, Bool Running test with mixed array downcast array execution time = 0.000522 downcast elements execution time = 0.571749 // var actuallyStrings: [AnyObject] = [AnyObject]() // filled with String values Running test with all strings downcast array execution time = 1.141267 downcast elements execution time = 0.853765 

它看起来像是非常快速地将混合数组视为不可下注,因为它只需要扫描,直到find一个非String元素。 对于一个可以向下转换的数组,它显然必须在整个数组中紧缩,并且需要更长的时间,尽pipe我不确定为什么它不像循环数组和手动检查每个元素那样快。

我们来试试这个

 var someObjects = [ NSString(), NSUUID() ] let uuids = someObjects as? NSUUID[] 

uuids是零

 var someOtherObjects = [ NSUUID(), NSUUID() ] let all_uuids = someOtherObjects as? NSUUID[] 

all_uuids等于someOtherObjects

所以它看起来像它的工作。 您可以使用expression式来testing数组的所有元素是否为预期types,但是不会过滤数组以仅select预期types。

Interesting Posts