是否可以将[AnyObject]数组转发为特定于类型的数组?

nhg*_*rif 41 arrays casting swift

我正在阅读Swift文档,查看关于类型转换的部分.

该文档讨论了[AnyObject]从Foundation框架中获取类型的数组(NSArray *Objective-C中的内容).

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

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

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

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

然后,文档提供了编写第一个循环的更好方法的示例:

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

我们someObjects从一个[AnyObject]到另一个向下倾斜的地方,[Movie]所以我们不必在循环中贬低.

这让我想到,阵列可以作为一个整体选择垂头丧气吗?

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

这有用吗?如果是这样,从性能的角度来看,这有多糟糕?使用可选的向下转换检查10,000个元素数组中每个对象的类型需要多长时间?

我知道这段代码与我之前的可选向下广告代码段之间的含义是不同的.第一个将迭代遍历每个对象,并且只有在对象是a时才尝试打印Movie,其中第二个只有在数组可以向下转换为[Movie]数组时才进入循环,在这种情况下它将打印全部或不打印,但我可以想象有些情况会更好.

Nat*_*ook 38

你已经拥有它 - 它的工作原理与你的示例代码完全相同:

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]"
Run Code Online (Sandbox Code Playgroud)

不知道性能,但我不认为它必须遍历整个数组以确定是否可能进行向下转换.


所以我很好奇,并且在几个不同的[AnyObject]配置中运行了100,000个简单值的快速测试,我试图将数组[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
Run Code Online (Sandbox Code Playgroud)

看起来将混合数组视为不可向下转换的速度非常快,因为它只需扫描直到找到非String元素.对于一个可以向下转换的数组,它显然必须处理整个数组,并且需要更长的时间,尽管我不确定为什么它与循环数组并手动检查每个元素的速度不同.