【问题标题】:leaving textfields blank - crash - swift 4将文本字段留空 - 崩溃 - swift 4
【发布时间】:2018-12-06 19:42:24
【问题描述】:

我正在尝试使用文本字段创建课程平均计算器。但是,如果我只想输入几个标记(即不填写所有文本字段),我会崩溃。

我收到此错误:

线程 1:致命错误:在展开可选值时意外发现 nil

在我的代码中,我试图避免这个 nil 值,但是如果我将第一个文本字段留空,我会在第一行得到错误。我对这些文本字段进行了进一步的计算,所以我不确定修复这些行后是否会出现类似的错误。

    if b?.text != nil {
        b?.text = String(Double(b!.text!)!/100)
    }
    if d?.text != nil {
        d?.text = String(Double(d!.text!)!/100)

    }
    if f?.text != nil {
        f?.text = String(Double(f!.text!)!/100)
    }
    if h?.text != nil {
        h?.text = String(Double(h!.text!)!/100)
    }

【问题讨论】:

  • 来自文档(关于UITextFieldtext 属性):此字符串默认为@""。所以即使text 属性的类型是String?,在大多数情况下它也不是nil。如果text 不为空,对您来说可能更好:if !textField.text.isEmpty

标签: ios swift null uitextfield unwrap


【解决方案1】:

强制解开双重转换

Double(b!.text!)!

是空字符串无法转换为双精度的原因,因此它返回 nil 并且当您使用 ! 时,因此崩溃,您需要

if let tex = b , content = tex.text ,  value = Double(content) {
   print(value)
}

也不要将 b var 设为可选!

 var b:UITextField! // and make sure you init it 

编辑:不要创建其他变量来保存实例,直接使用它们

@IBOutlet weak var weight1: UITextField!

if let content = weight1.text ,  value = Double(content) {
   print(value)
   weight1.text = "\(value/100)"
}

【讨论】:

  • 所以写if let b?.text = String(Double(b!.text!)!/100)
  • 我有@IBOutlet weak var weight1: UITextField!let var b = weight1
【解决方案2】:
Double(b!.text!)! 

这就是原因,您的输入文本 (b!.text!) 不能转换为 double 因此以 nil 结束。

例如:您可能输入“12Th45”,这不能转换为双精度。

在您不确定该值是否存在时,始终使用可选绑定。

谢谢。

【讨论】:

    猜你喜欢
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-28
    • 1970-01-01
    • 2017-12-26
    相关资源
    最近更新 更多