我有这个 for-in 循环:
for button in view.subviews {
}
现在我想将按钮转换为自定义类,以便我可以使用它的属性。
我试过这个:for button in view.subviews as AClass
但它不起作用并给我一个错误:'AClass' does not conform to protocol 'SequenceType'
我试过这个:for button:AClass in view.subviews
但这也行不通。
最佳答案
对于 Swift 2 及更高版本:
Swift 2 将 case 模式添加到 for 循环中,这使得在 for 循环中键入强制转换变得更加容易和安全:
for case let button as AClass in view.subviews {
// do something with button
}
为什么这比您在 Swift 1.2 和更早版本中可以做的更好?因为 case patterns 允许您从集合中挑选您的特定类型。它只匹配您要查找的类型,因此如果您的数组包含混合类型,您只能对特定类型进行操作。
例如:
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
,因此您需要将其向下转换为您想要的类型的数组:
for button in view.subviews as! [AClass] {
// do something with button
}
注意:如果底层数组类型不是[AClass]
,这将崩溃。这就是 as!
上的 !
告诉你的。如果您不确定类型,您可以使用条件转换 as?
以及可选的绑定(bind) 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
}
注意:如果 subview 不都是 AClass
类型,这也会崩溃。上面列出的安全方法也适用于早期版本的 Swift。
关于for-loop - for-in 循环中的类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26076772/