首页 > 解决方案 > 什么是最佳实践,将 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
}()

标签: swiftclosurescomputed-properties

解决方案


第二个选项不会不断更新。因为它不是作为闭包存储的!它仅使用闭包存储一次

所以在这个问题中,你只有第一个选项作为选择。

一些有用的注释:

  1. 强制展开并同时使用 nil 合并运算符是没有意义的:
Double(someField.text! ?? "0") // exclamation mark is nonesense here
  1. 在 get-only 计算属性中,您可以去掉get关键字:
var fieldValue: Double {
    return Double(someField.text ?? "0") as! Double
}
  1. 您不需要强制转换DoubleDouble
var fieldValue: Double {
    return Double(someField.text ?? "0")!
}
  1. return从 Swift 5.1 开始,单行表达式不需要关键字:
var fieldValue: Double { Double(someField.text ?? "0")! }
  1. 如果初始化程序无法从文本初始化 a ,您似乎需要 a0作为默认值,对吧?!Double因此,也将 force unwrap 替换为默认值:
var fieldValue: Double { Double(someField.text ?? "0") ?? 0 }
  1. 正如@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
        ,,,
    }

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


推荐阅读