subview
свойство UIView
является массивом AnyObject
. Время выполнения происходит из-за того, что вы выполняете принудительное понижение от [AnyObject]
до [UIButton]
.
С точки зрения компилятора, вниз литая законен:
let x: [UIButton] = [AnyObject]() as [UIButton]
потому AnyObject
может быть любой класс, и UIButton
класс.
В вашем случае, если вы делаете предположение, что все объекты, содержащиеся в subviews
являются экземплярами UIButton
, которые могут быть возможно (если вы явно добавить UIButton
S только к виду), но если вид имеет и другие элементы пользовательского интерфейса (этикетки , другие представления и т. д.), тогда downcast будет работать во время выполнения.
Если, например, вид содержит другой вид, выше опущенного эквивалентно делать это:
var view = UIView()
var button = view as UIButton
которая не потому, что UIView
не UIButton
(хотя благодаря полиморфизму наоборот, будучи UIButton
унаследован от UIView
).
Если вы хотите, чтобы ваш код для печати метки для всех UIButton
с, игнорируя все другие элементы пользовательского интерфейса, то @ ответ rahul_send89 является правильным: он перебирает все элементы subview
собственности, и она печатает тег только если текущий элемент равен UIButton
.
@ Ответ SteveRosenberg вместо этого напечатает тег для всех элементов, независимо от их фактического типа.
В зависимости от того, что вы хотите делать с вашими кнопками (я полагаю, что код, отправленный в вашем вопросе, является просто заполнителем, чтобы объяснить проблему), есть альтернативный способ: фильтровать все кнопки из свойства subviews
и хранить в массиве:
var buttons = mainView.subviews.filter { $0 is UIButton } as [UIButton]
и делать все, что вам нужно с этим массивом UIButton
, такие как печать их тег.
for button in buttons {
println(button.tag)
}
Привет Антонио, спасибо за этот великий ответ , Вы правы, println является просто заполнителем. Ваше предложение - именно то, что я хочу. Это даже дает мне больше возможностей для улучшения моего кода во всем проекте. Большое спасибо. – Adaoli