Я читаю документацию 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], и в этом случае он либо распечатает все или нет, но я могу представить себе, что есть ситуации, когда это было бы предпочтительнее.