gpt4 book ai didi

Swift:为什么这是不可变的?

转载 作者:行者123 更新时间:2023-11-28 10:18:05 25 4
gpt4 key购买 nike

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

我有几个包含 UILabel 和 UITextForm 的 [AnyObject] 数组。此 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
}
}
}

最佳答案

这里有很多编译错误

问题#1(这只是一个建议)

inout这里不需要,因为你没有改变 section数组,您正在改变其中的对象。

问题#2

inout应该在参数名称之前(如果您使用的是 Swift 2.2)

问题#3

你应该使用 self与动态类型比较时

问题#4

你不能写 section[i].isEnabled = false因为 AnyObject没有成员(member) isEnabled所以你应该做 Actor

问题#5

您正在访问数组之外​​的索引,所以这

0...section.count

应该变成这样

0..<section.count

代码版本#1

现在你的代码看起来像这样

func disableSectionForm(formSection section: [AnyObject]) {
for i in 0..<section.count {
if section[i].dynamicType == UILabel.self {
(section[i] as? UILabel)?.enabled = false
} else if section[i].dynamicType == UITextField.self {
(section[i] as? UITextField)?.enabled = false
}
}
}

代码版本#2

开始于:

  1. 您可以以更安全的方式迭代您的元素
  2. 你应该使用conditional cast而不是 dynamicType comparation

你可以写进去

Swift 2.2

func disableSectionForm(formSection section: [AnyObject]) {
section.forEach {
switch $0 {
case let label as UILabel: label.enabled = false
case let textField as UITextField: textField.enabled = false
default: break
}
}
}

Swift 3.0 (beta 6)

func disableSectionForm(formSection section: [Any]) {
section.forEach {
switch $0 {
case let label as UILabel: label.isEnabled = false
case let textField as UITextField: textField.isEnabled = false
default: break
}
}
}

代码版本#3

让我们定义一个协议(protocol)来表示具有 enabled 的类 bool 属性。

Swift 2.2

protocol HasEnabledProperty:class {
var enabled: Bool { get set }
}

让我们遵守它UILabelUITextLabel

extension UILabel: HasEnabledProperty { }
extension UITextField: HasEnabledProperty { }

最后……

func disableSectionForm(formSection section: [AnyObject]) {
section.flatMap { $0 as? HasEnabledProperty }.forEach { $0.enabled = false }
}

Swift 3.0 (beta 6)

protocol HasEnabledProperty:class {
var isEnabled: Bool { get set }
}

extension UILabel: HasEnabledProperty { }
extension UITextField: HasEnabledProperty { }

func disableSectionForm(formSection section: [Any]) {
section.flatMap { $0 as? HasEnabledProperty }.forEach { $0.isEnabled = false }
}

关于Swift:为什么这是不可变的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39054842/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com