在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] { }