删除文本导致 "Unexpectedly found nil while unwrapping an optional value"
Deletion of text leads to "Unexpectedly found nil while unwrapping an optional value"
我正在为一家围栏公司编写一个应用程序,用户可以在其中指定他们需要多少米的围栏,它将计算该计量所需的面板、脚和夹子的数量,我还有 2 个字段,他们可以在其中可以在他们的订单中添加额外的夹具和额外的脚,当他们这样做时,它会自动更新它之前计算的值以包括额外的。
只要文本字段中始终包含数字,此方法就可以正常工作,例如,如果您在第一个框中输入 30m,应用程序会计算出您需要 31 英尺,如果我在上面添加 3 英尺它显示的顺序是 34 英尺,如果我随后改变主意并删除额外英尺字段的内容,应用程序会因 finding nil while unwrapping an optional value
而崩溃,有没有办法解决这个问题?
我有以下代码:
@IBAction func AdditionalFeetField(sender: AnyObject) {
if AdditionalFeetField.text != nil {
let AdditionalFeetValue1 = Double(PanelQtyField.text!);
let AdditionsFeetValue2 = Double(AdditionalFeetField.text!);
let AdditionalFeetResult = (AdditionalFeetValue1! + AdditionsFeetValue2!) + 1
self.FeetQtyLabel.text = "\(AdditionalFeetResult)"
}
}
`
在这种情况下,当您使用 !
时,您将强制展开文本字段的值,这意味着您对编译器说 "Just give me the value of the text field, I don't care if it is nil or not"。这几乎总是一个坏主意......正如您所发现的:-)
更好的方法是使用 if let
或 guard
来展开值。
我已尝试更新您的函数以使用 if let
@IBAction func AdditionalFeetField(sender: AnyObject) {
if let additionalFeetStringValue = AdditionalFeetField.text,
let panelQtyFieldStringValue = PanelQtyField.text {
let additionalFeetValue1 = Double(panelQtyFieldStringValue) ?? 0
let additionsFeetValue2 = Double(additionalFeetStringValue) ?? 0
let additionalFeetResult = (additionalFeetValue1 + additionsFeetValue2) + 1
FeetQtyLabel.text = "\(AdditionalFeetResult)"
}
}
(我冒昧地删除了你的分号和 self
引用:-))
希望对您有所帮助。也许您可以将它与@mattias 关于检查该值是否可以转换为双精度的建议结合起来。
我正在为一家围栏公司编写一个应用程序,用户可以在其中指定他们需要多少米的围栏,它将计算该计量所需的面板、脚和夹子的数量,我还有 2 个字段,他们可以在其中可以在他们的订单中添加额外的夹具和额外的脚,当他们这样做时,它会自动更新它之前计算的值以包括额外的。
只要文本字段中始终包含数字,此方法就可以正常工作,例如,如果您在第一个框中输入 30m,应用程序会计算出您需要 31 英尺,如果我在上面添加 3 英尺它显示的顺序是 34 英尺,如果我随后改变主意并删除额外英尺字段的内容,应用程序会因 finding nil while unwrapping an optional value
而崩溃,有没有办法解决这个问题?
我有以下代码:
@IBAction func AdditionalFeetField(sender: AnyObject) {
if AdditionalFeetField.text != nil {
let AdditionalFeetValue1 = Double(PanelQtyField.text!);
let AdditionsFeetValue2 = Double(AdditionalFeetField.text!);
let AdditionalFeetResult = (AdditionalFeetValue1! + AdditionsFeetValue2!) + 1
self.FeetQtyLabel.text = "\(AdditionalFeetResult)"
}
}
`
在这种情况下,当您使用 !
时,您将强制展开文本字段的值,这意味着您对编译器说 "Just give me the value of the text field, I don't care if it is nil or not"。这几乎总是一个坏主意......正如您所发现的:-)
更好的方法是使用 if let
或 guard
来展开值。
我已尝试更新您的函数以使用 if let
@IBAction func AdditionalFeetField(sender: AnyObject) {
if let additionalFeetStringValue = AdditionalFeetField.text,
let panelQtyFieldStringValue = PanelQtyField.text {
let additionalFeetValue1 = Double(panelQtyFieldStringValue) ?? 0
let additionsFeetValue2 = Double(additionalFeetStringValue) ?? 0
let additionalFeetResult = (additionalFeetValue1 + additionsFeetValue2) + 1
FeetQtyLabel.text = "\(AdditionalFeetResult)"
}
}
(我冒昧地删除了你的分号和 self
引用:-))
希望对您有所帮助。也许您可以将它与@mattias 关于检查该值是否可以转换为双精度的建议结合起来。