【问题标题】:What is best practice, to enclose the value of a UITextField in a Computed property or in a Closure什么是最佳实践,将 UITextField 的值包含在 Computed 属性或闭包中
【发布时间】:2020-03-15 08:02:42
【问题描述】:

如果您有一个UITextField,并且您知道您将不断地引用它的值,并且您会将该值用作Double,那么以下两个示例中哪一个更有意义?或者更好的是,这两者中的任何一个都有意义吗?这是一个很好的做法吗?

计算属性

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

将属性存储为闭包

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

【问题讨论】:

  • 为什么要强制将Double 转换为Double?另外,为什么要为强制解包值提供默认值(这不再是可选的)?
  • 只是澄清一下,这是你如何获得Double 的价值的方式吗? var fieldValue: Double { Double(someField.text!) ?? 0 } Mojtaba Hosseini 建议。

标签: swift closures computed-properties


【解决方案1】:

第二个选项是不断地更新。因为它没有存储为 闭包!它使用闭包只存储一次

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

一些有用的注释:

  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. 您无需将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 和referenced 提到的,强制解开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
        ,,,
    }

您也可以为此使用委托方法。这取决于你。

【讨论】:

  • 强制解开UITextField.text是安全的,所以someField.text ?? "0"someField.text! ?? "0"一样没用,因为UITextField.text保证不为nil,由于Obj它只是Optional -C 遗留支持。看看Why is UITextField.text Optional
  • @ Mojtaba Hosseini - 非常感谢您的好建议!我猜你的意思是 exclamation point 不是问号。
  • @DávidPásztor 是的,它在纯 Swift 代码中没用,但有时很有意义。谢谢你提到这一点。我在我的回答中添加了关于你名字的内容。
猜你喜欢
  • 2021-03-22
  • 2013-07-05
  • 2010-10-30
  • 2015-08-03
  • 2010-09-23
  • 2022-12-20
  • 1970-01-01
  • 1970-01-01
  • 2011-11-21
相关资源
最近更新 更多