for-loop - for-in 循环中的类型转换

标签 for-loop swift for-in-loop

我有这个 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/

相关文章:

python - 函数似乎返回多个结果或 : what is implicit tuple unpacking

python - 如何让我的计数重置为循环

arrays - 不确定这种 inout 场景是如何安全的,因为数组在返回时会失效

Chrome 示例扩展中的 Javascript for...in 循环

javascript - for...in 循环在 JavaScript 中有用吗?

R for循环索引问题

javascript - 循环遍历每次迭代并将其保存到数组中

ios - 自动布局 : frame is 600x480 in compact/Any size class, 的 ScrollView 大小大于 iphone5?

ios - swift:在零时停止倒数计时器

JavaScript:JSLint 错误 "The body of a for in should be wrapped in an if statement to filter unwanted properties from the prototype"