的UIView
的subview
屬性的AnyObject
數組。運行時發生是因爲您正在執行從[AnyObject]
到[UIButton]
的強制向下轉換。
從編譯器的角度看,向下轉換是合法的:
let x: [UIButton] = [AnyObject]() as [UIButton]
因爲AnyObject
可以是任何類,並且UIButton
是一類。
你的情況,你製作的包含在subviews
所有對象都是UIButton
情況下的假設,它可以是可能的(如果你明確添加UIButton
唯一的看法),但如果認爲有其他用戶界面元素(標籤,其他視圖等),則downcast將在運行時失敗。
如果例如視圖包含另一視圖,上面的低垂相當於這樣做:
var view = UIView()
var button = view as UIButton
其失敗,因爲一個UIView
不是UIButton
(儘管由於多態性情況正好相反,是UIButton
從UIView
繼承)。
如果您希望您的代碼打印標籤的所有UIButton
S,忽略所有其他UI元素,然後@ 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 2014-10-08 10:21:41