- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
你能告诉我为什么这段代码不起作用吗?
我有几个包含 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
}
}
}
最佳答案
这里有很多编译错误
inout
这里不需要,因为你没有改变 section
数组,您正在改变其中的对象。
inout
应该在参数名称之前(如果您使用的是 Swift 2.2)
你应该使用
self
与动态类型比较时
你不能写
section[i].isEnabled = false
因为
AnyObject
没有成员(member)
isEnabled
所以你应该做 Actor
您正在访问数组之外的索引,所以这
0...section.count
应该变成这样
0..<section.count
现在你的代码看起来像这样
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
}
}
}
开始于:
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
}
}
}
让我们定义一个协议(protocol)来表示具有 enabled
的类 bool 属性。
Swift 2.2
protocol HasEnabledProperty:class {
var enabled: Bool { get set }
}
让我们遵守它UILabel
和 UITextLabel
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/
COW 不是奶牛,是 Copy-On-Write 的缩写,这是一种是复制但也不完全是复制的技术。 一般来说复制就是创建出完全相同的两份,两份是独立的: 但是,有的时候复制这件事没多大必要
我是一名优秀的程序员,十分优秀!