的subview
属性UIView
是一个数组AnyObject
。运行时发生是因为您正在执行从[AnyObject]
to的强制向下转换[UIButton]
。
从编译器的角度来看,向下转换是合法的:
let x: [UIButton] = [AnyObject]() as [UIButton]
因为AnyObject
可以是任何类,并且UIButton
是一个类。
在您的情况下,您假设其中包含的所有对象subviews
都是 的实例UIButton
,这是可能的(如果您UIButton
仅将 s 显式添加到视图中),但如果视图具有其他 UI 元素(标签、其他视图等)那么向下转型将在运行时失败。
例如,如果视图包含另一个视图,则上面的向下转换等效于执行此操作:
var view = UIView()
var button = view as UIButton
失败是因为 aUIView
不是 a UIButton
(尽管由于多态性,相反的情况是正确的,UIButton
从 继承UIView
)。
如果您希望您的代码打印所有UIButton
s 的标记,而忽略所有其他 UI 元素,那么@rahul_send89 的答案是正确的:它循环遍历subview
属性的所有元素,并且仅当当前元素是 a 时才打印标记UIButton
。
@SteveRosenberg 的答案改为打印所有元素的标签,无论它们的实际类型如何。
根据您想对按钮执行的操作(我认为您问题中发布的代码只是解释问题的占位符),还有另一种方法:从subviews
属性中过滤所有按钮并存储到数组中:
var buttons = mainView.subviews.filter { $0 is UIButton } as [UIButton]
并用这个数组做任何你需要的事情UIButton
,比如打印他们的标签。
for button in buttons {
println(button.tag)
}