Xcode 用于批量en\disable的快速混合类型UIControl数组

Xcode 用于批量en\disable的快速混合类型UIControl数组,xcode,swift,Xcode,Swift,我正在尝试禁用大量不同的控件。如果数组是[Slider1、Slider2、Slider3]或任何其他匹配uicontrol集,则此操作正常 let C = [Slider, Button, Label] for control in C, { control.enabled = B } 返回错误“UIView类型的值没有“已启用”成员。” 我假设当我混合uicontrol类型时,它将数组类型为UIView 有没有办法使这项工作或其他类似的有效方法?问题在于标签。虽然ui标签有一个名为

我正在尝试禁用大量不同的控件。如果数组是[Slider1、Slider2、Slider3]或任何其他匹配uicontrol集,则此操作正常

let C = [Slider, Button, Label]
for control in C,  {
    control.enabled = B
}
返回错误“UIView类型的值没有“已启用”成员。” 我假设当我混合uicontrol类型时,它将数组类型为UIView


有没有办法使这项工作或其他类似的有效方法?

问题在于
标签。虽然
ui标签
有一个名为
已启用的成员
,但它与
ui标签
ui按钮
的成员不同

正如您正确提到的,后面的代码继承自提供启用的成员

但是,
ui标签
没有。它只是(巧合地)定义了一个名为
enabled
的成员。然而,编译器并不真正关心成员的命名。他寻找第一个常见的超类,它是
UIView
,它没有名为
enabled的成员,就是这样

因此,您的解决方案是仅在数组中组合实际的
UIControls
。这些文件列出了以下内容:

  • UIButton
  • 数据采集器
  • UIPageControl
  • 刷新控制
  • UISegmentedControl
  • 乌斯利德
  • 乌斯泰珀
  • 开关
  • UITextField

标签上的循环必须在不同的/秒循环中完成。

您可以使
UILabel
UIControl
符合公共协议:

protocol HasEnabled : class {
    var enabled: Bool { get set }
}
extension UILabel : HasEnabled { }
extension UIControl : HasEnabled { }
然后,您可以声明
hasaEnabled
类型的数组:

let controls : [ HasEnabled ] = [ label, slider, button ]
for control in controls {
    control.enabled = true
}
或者声明一个
UIView
数组,但只在元素上迭代 符合
已启用的

let controls : [UIView] =  [ label, slider, button ]
for case let control as HasEnabled in controls {
    control.enabled = true
}
在第一种情况下,编译器确保只有 符合
的已启用的
将添加到数组中

在第二种情况下,可以将任意
UIView
对象添加到 数组,但循环体仅对符合条件的数组执行 至
已启用