的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)。
如果您希望您的代码打印所有UIButtons 的标记,而忽略所有其他 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)
}