一个数组可以被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)") }
现在,我想稍微改变一下例子,我不知道所有的对象都是Movie
types,所以我会这样做:
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。