Swift 斯威夫特:为什么这是不变的?

Swift 斯威夫特:为什么这是不变的?,swift,immutability,Swift,Immutability,你能告诉我为什么这个代码不起作用吗 我有几个[AnyObject]数组,其中包含UILabels和UITextForm。 此func应将数组作为参数,并禁用所有标签和文本表单。我试过使用map,但仍然有同样的问题,编译器告诉我,或者变量是常量,或者是不可变的 func disableSectionForm(formSection section: inout [AnyObject]) { for i in 0...section.count { if section[i]

你能告诉我为什么这个代码不起作用吗

我有几个
[AnyObject]
数组,其中包含UILabels和UITextForm。 此
func
应将数组作为参数,并禁用所有标签和文本表单。我试过使用map,但仍然有同样的问题,编译器告诉我,或者变量是常量,或者是不可变的

func disableSectionForm(formSection section: inout [AnyObject]) {
    for i in 0...section.count {
        if section[i] is UILabel || section[i] is UITextField {
            section[i].isEnabled = false
        }
    }
}

尝试检查是否让阻止并使用选项

func disableSectionForm(formSection section: inout [AnyObject]) {
            for i in 0...section.count {
                if let label = section[i] as? UILabel {
                     label.isEnabled = false
                }
                if let textField = section[i] as? UITextFiled {
                     textField.isEnabled = false
                }
            }
 }

尝试检查是否让阻止并使用选项

func disableSectionForm(formSection section: inout [AnyObject]) {
            for i in 0...section.count {
                if let label = section[i] as? UILabel {
                     label.isEnabled = false
                }
                if let textField = section[i] as? UITextFiled {
                     textField.isEnabled = false
                }
            }
 }

这里有许多编译错误

问题1(这只是一个建议) 此处不需要
inout
,因为您不是在变异
数组,而是在变异数组中的对象

问题2
inout
应位于参数名称之前(如果您使用的是Swift 2.2)

第3期 与dynamicType比较时,应使用
self

问题4 您无法写入
节[i]。isEnabled=false
,因为
任何对象
都没有成员
isEnabled
,所以您应该执行强制转换

第5期 您正在访问数组外部的索引,因此

0...section.count
应该是这样

0..<section.count
Swift 3.0(测试版6)


代码版本#3 让我们定义一个协议来表示启用了
属性的类

Swift 2.2

让我们遵守它
UILabel
uitextlab

extension UILabel: HasEnabledProperty { }
extension UITextField: HasEnabledProperty { }
最后

func disableSectionForm(formSection section: [AnyObject]) {
    section.flatMap { $0 as? HasEnabledProperty }.forEach { $0.enabled = false }
}
Swift 3.0(测试版6)


这里有许多编译错误

问题1(这只是一个建议) 此处不需要
inout
,因为您不是在变异
数组,而是在变异数组中的对象

问题2
inout
应位于参数名称之前(如果您使用的是Swift 2.2)

第3期 与dynamicType比较时,应使用
self

问题4 您无法写入
节[i]。isEnabled=false
,因为
任何对象
都没有成员
isEnabled
,所以您应该执行强制转换

第5期 您正在访问数组外部的索引,因此

0...section.count
应该是这样

0..<section.count
Swift 3.0(测试版6)


代码版本#3 让我们定义一个协议来表示启用了
属性的类

Swift 2.2

让我们遵守它
UILabel
uitextlab

extension UILabel: HasEnabledProperty { }
extension UITextField: HasEnabledProperty { }
最后

func disableSectionForm(formSection section: [AnyObject]) {
    section.flatMap { $0 as? HasEnabledProperty }.forEach { $0.enabled = false }
}
Swift 3.0(测试版6)


非常感谢。我应该使用if-let还是dynamicType?@appzYourLife-issue#6任何对象都非常有用dead@appzYourLife不,我是说任何物体都是死的。现在一切都好了。使用AnyObject将导致代码中断,因为不再有任何自动桥接到AnyObject。因此,摆脱使用任何对象的习惯是个好主意。(当然,正如您所说,在任何情况下使用UIView都是一个好主意。)另外,
dynamicType
现在是
type(Of:)
。顺便说一句,现在任何东西都可以桥接到任何对象:。谢谢!我应该使用if-let还是dynamicType?@appzYourLife-issue#6任何对象都非常有用dead@appzYourLife不,我是说任何物体都是死的。现在一切都好了。使用AnyObject将导致代码中断,因为不再有任何自动桥接到AnyObject。因此,摆脱使用任何对象的习惯是个好主意。(当然,正如你所说,在任何情况下使用UIView都是一个好主意。)另外,
dynamicType
现在是
type(Of:)
。顺便说一句,现在任何东西都可以桥接到任何对象:.happy coding@AndreaMiottohappy coding@AndreaMiotto