试图枚举一个数组

Trying to enumerate an array

我有 mainStack 作为 UIStackView。此堆栈包含 4 UIStackViews。这两个 4 个堆栈中的每一个都包含 2 个按钮。我正在尝试通过枚举来定位这些按钮,使用以下代码:

// get the subviews of the main stack
let subviews = mainStack!.arrangedSubviews as Array

// enumerate each one
for subStack in subviews as UIStackView { // 1
  let buttons = subStack.subvies

}

我在 //1 上遇到错误消息:

Cannot convert value of type '[UIView]' to type 'UIStackView' in coercion

这是为什么?主堆栈的子视图是 UIStackViews.are

有什么想法吗?

"The subviews of the main stack are UIStackViews"

stackview 可能还包含其他 UI 元素。您可以像这样将 pattern matching 与 for 循环一起使用

for case let stackView as UIStackView in mainStackView.arrangedSubviews  {
    for case let button as UIButton in stackView.arrangedSubviews {
        button.addTarget...
    }
}

为什么出错?

for subStack in subviews as UIStackView 

在上面的代码行中,subviews 是一个 Array,而您正试图将其解析为 UIStackView。这就是它给出编译器错误的原因。

解法:

你可以简单地喜欢,

if let subviews = mainStack?.arrangedSubviews as? [UIStackView] {
    subviews.forEach { (subStack) in
        let buttons = subStack.arrangedSubviews as? [UIButton]
        //add your code here...
    }
}

注意:使用 if-let 展开 optionals 而不是 force unwrapping(!) 它们。