swift - 什么是最佳实践,将 UITextField 的值包含在 Computed 属性或闭包中
问题描述
如果您有 aUITextField
并且您知道您将不断引用它的值,并且您将使用该值作为 aDouble
以下两个示例中的哪个更有意义?或者更好的是,这两者中的任何一个都有意义吗?这是一个很好的做法吗?
计算属性
var fieldValue:Double {
get{
return Double(someField.text! ?? "0") as! Double
}
}
将属性存储为闭包
var fieldValue:Double = {
return Double(someField.text! ?? "0") as! Double
}()
解决方案
第二个选项不会不断更新。因为它不是作为闭包存储的!它仅使用闭包存储一次。
所以在这个问题中,你只有第一个选项作为选择。
一些有用的注释:
- 强制展开并同时使用 nil 合并运算符是没有意义的:
Double(someField.text! ?? "0") // exclamation mark is nonesense here
- 在 get-only 计算属性中,您可以去掉
get
关键字:
var fieldValue: Double {
return Double(someField.text ?? "0") as! Double
}
- 您不需要强制转换
Double
为Double
:
var fieldValue: Double {
return Double(someField.text ?? "0")!
}
return
从 Swift 5.1 开始,单行表达式不需要关键字:
var fieldValue: Double { Double(someField.text ?? "0")! }
- 如果初始化程序无法从文本初始化 a ,您似乎需要 a
0
作为默认值,对吧?!Double
因此,也将 force unwrap 替换为默认值:
var fieldValue: Double { Double(someField.text ?? "0") ?? 0 }
- 正如@Dávid Pásztor 提到和引用的那样,强制 unwrap 是安全的
UITextField().text
,所以 someField.text ?? "0" 和 someField.text 一样没用!?? “0”,因为 UITextField.text 保证为非零,由于 Obj-C 遗留支持,它只是可选的。因此,如果您不引用Obj-C
,则可以像这样使用它:
var fieldValue: Double { Double(someField.text!) ?? 0 }
其他选项:
如果需要,您可以使用valueChanged
的事件textField
来获得通知并在函数中做出反应:
// Somewhere soon like `viewDidLoad`
someField.addTarget(self, action: #selector(someFieldChanged(_:)), for: .valueChanged)
}
@objc private func someFieldChanged(_ sender: UITextField) {
let fieldValue = Double(sender.text ?? "0") ?? 0
,,,
}
您也可以为此使用委托方法。由你决定。
推荐阅读
- html - 单击另一个复选框时复选框变为未选中状态
- c++ - C++ 不能精确计算
- python - 当一个for循环在另一个for循环中运行时如何将一个列表附加到另一个列表中
- android - 如何使用微调器从 Firebase 中检索列表?
- javascript - 如何使用javascript从特定的css类中获取价值
- python - 我正在抓取以下包含 java 脚本但出现错误的网站
- migration - MIP - 从 AIP 迁移
- css - Wordpress 仅通过编辑器在帖子中不显示 sup/sub
- macos - macOS 中的主文件夹被点文件弄得杂乱无章
- php - 基本的 PHP 时间计算有错误的答案