web-dev-qa-db-ja.com

[AnyObject]配列をオプションで型固有の配列にダウンキャストできますか?

私はSwiftのドキュメントを読み、型キャストに関するセクションを見ています。

ドキュメントでは、Foundationフレームワークなどから[AnyObject]型の配列を取得することについて説明しています(Objective-CではNSArray *になります)。

最初に、ドキュメントはこの例を提供します:

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

ここで、すべてのオブジェクトがMovie型であることがわからない場合に、例を少し変更したいので、次のようにします。

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)")
}

someObjects[AnyObject]から[Movie]にダウンキャストするため、ループ内でダウンキャストする必要はありません。

そして、これは私に考えさせられました、アレイは全体としてオプションに落胆することができますか?

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

これは機能しますか?もしそうなら、パフォーマンスの観点からこれはどれほど悪いですか?オプションのダウンキャストを使用して、10,000要素配列内のすべてのオブジェクトのタイプをチェックするのにどれくらい時間がかかりますか?

このスニペットと以前のオプションのダウンキャストスニペットの間の意味が異なることを理解しています。 1つ目はすべてのオブジェクトを反復処理し、オブジェクトがMovieである場合にのみ印刷を試みます。2つ目は、配列を[Movie]配列にダウンキャストできる場合にのみループに入ります。すべてを印刷するか、まったく印刷しませんが、これが望ましい状況があると想像できます。

41
nhgrif

これを試してみましょう

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

uuidsはnilです

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

all_uuidssomeOtherObjectsと等しい

そのため、動作するように見えます。式を使用して、配列のすべての要素が予想されるタイプであるかどうかをテストできますが、予想されるタイプのみを選択するように配列をフィルタリングしません。

1
Rod