Я читаю документацию Swift, рассматривая раздел о литье типов.
В документации говорится о получении массива типа [AnyObject]
из материала фреймворка Foundation (что было бы NSArray *
в Objective-C).
Во-первых, в документации приведен пример:
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)")
}
}
Это работает? И если да, насколько это плохо с точки зрения производительности? Сколько времени потребуется, чтобы проверить тип каждого объекта в массиве из 10000 элементов, используя необязательный downcast?
Я понимаю, что последствия между этим фрагментом и моим предыдущим необязательным снижением фрагмента различны. Первый будет перебирать каждый объект и только попытаться распечатать, если объект является Movie
, где второй будет вводить только цикл, если массив может быть опущен до массива [Movie]
, и в этом случае он либо распечатает все или нет, но я могу представить себе, что есть ситуации, когда это было бы предпочтительнее.