For Swift 2 and later:
Swift 2 adds case patterns to for loops, which makes it even easier and safer to type cast in a for loop:
for case let button as AClass in view.subviews {
// do something with button
}
Why is this better than what you could do in Swift 1.2 and earlier? Because case patterns allow you to pick your specific type out of the collection. It only matches the type you are looking for, so if your array contains a mixture, you can operate on only a specific type.
For example:
let array: [Any] = [1, 1.2, "Hello", true, [1, 2, 3], "World!"]
for case let str as String in array {
print(str)
}
Output:
Hello
World!
For Swift 1.2:
In this case, you are casting view.subviews
and not button
, so you need to downcast it to the array of the type you want:
for button in view.subviews as! [AClass] {
// do something with button
}
Note: If the underlying array type is not [AClass]
, this will crash. That is what the !
on as!
is telling you. If you're not sure about the type you can use a conditional cast as?
along with optional binding if let
:
if let subviews = view.subviews as? [AClass] {
// If we get here, then subviews is of type [AClass]
for button in subviews {
// do something with button
}
}
For Swift 1.1 and earlier:
for button in view.subviews as [AClass] {
// do something with button
}
Note: This also will crash if the subviews aren't all of type AClass
. The safe method listed above also works with earlier versions of Swift.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…