什么是最佳实践,将 UITextField 的值包含在 Computed 属性 或 Closure 中

What is best practice, to enclose the value of a UITextField in a Computed property or in a Closure

如果您有一个 UITextField 并且您知道您将不断引用它的值,并且您将使用该值作为 Double 以下两个示例中哪个更有意义?或者更好的是,两者中的任何一个有意义吗?这是一个值得遵循的好习惯吗?

计算属性

var fieldValue:Double {
    get{
        return Double(someField.text! ?? "0") as! Double
    }   
}

将属性存储为闭包

var fieldValue:Double = {
    return Double(someField.text! ?? "0") as! Double
}()

第二个选项是经常更新。因为它没有存储 作为 闭包!它 使用 闭包存储 一次

所以这道题,你只有第一个选项可以选择。

一些有用的注释:

  1. 同时强制解包和使用 nil 合并运算符是没有意义的:
Double(someField.text! ?? "0") // exclamation mark is nonesense here
  1. 在仅获取计算属性中,您可以去掉 get 关键字:
var fieldValue: Double {
    return Double(someField.text ?? "0") as! Double
}
  1. 您不需要将 Double 强制转换为 Double:
var fieldValue: Double {
    return Double(someField.text ?? "0")!
}
  1. 自 Swift 5.1 起,单行表达式不需要 return 关键字:
var fieldValue: Double { Double(someField.text ?? "0")! }
  1. 如果初始化程序无法从文本中初始化 Double,那么您似乎需要一个 0 作为默认值,对吧?!因此,也将 force unwrap 替换为默认值:
var fieldValue: Double { Double(someField.text ?? "0") ?? 0 }
  1. 正如@Dávid Pásztor 提到的和 ,强制展开 UITextField().text 是安全的,所以 someField.text ?? “0”和someField.text一样没用! ?? “0”,因为 UITextField.text 保证为非零,由于 Obj-C 遗留支持,它只是可选的。所以如果你没有引用 Obj-C,你可以像这样使用它:
var fieldValue: Double { Double(someField.text!) ?? 0 }

其他选项:

如果需要,您可以使用 textFieldvalueChanged 事件来获得通知并在函数中做出反应:

// 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
        ,,,
    }

您也可以为此使用委托方法。由你决定。