在for-in循环中inputtypes
我有这个for-in循环:
for button in view.subviews { }
现在我想要button被投入到一个自定义的类,所以我可以使用它的属性。
我试过这个: for button in view.subviews as AClass
但它不起作用,并给我一个错误: 'AClass' does not conform to protocol 'SequenceType'
我试过这个: for button:AClass in view.subviews
但是这个工作也没有。
对于Swift 2和更高版本:
Swift 2为for循环添加了case模式 ,这使得在for循环中键入cast变得更加简单和安全:
for case let button as AClass in view.subviews { // do something with button }
为什么这比你在Swift 1.2和更早版本中做的更好? 由于案例模式允许您从集合中select特定的types。 它只匹配你正在查找的types,所以如果你的数组包含一个混合,你只能操作一个特定的types。
例如:
let array: [Any] = [1, 1.2, "Hello", true, [1, 2, 3], "World!"] for case let str as String in array { print(str) }
输出:
Hello World!
对于Swift 1.2 :
在这种情况下,您正在投影view.subviews
而不是button
,所以您需要将其向下转换为所需types的数组:
for button in view.subviews as! [AClass] { // do something with button }
注意:如果底层数组types不是[AClass]
,则会崩溃。 那是什么!
上as!
告诉你。 如果你不确定这个types,你可以使用一个条件转换as?
以及可选的绑定, 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 } }
对于Swift 1.1和更早版本:
for button in view.subviews as [AClass] { // do something with button }
注意:如果子视图不是全部types的AClass
这也会崩溃。 上面列出的安全方法也适用于早期版本的Swift。
这个选项更安全:
for case let button as AClass in view.subviews { }
你也可以使用where
子句
for button in view.subviews where button is UIButton { ... }
在Swift 1.0中,vacawama提供的答案是正确的。 而不再适用于Swift 2.0。
如果你尝试,你会得到类似的错误:
“[AnyObject]”不能转换为“[AClass]”;
在Swift 2.0中,你需要这样写:
for button in view.subviews as! [AClass] { }