准备segue意外发现nil同时展开一个Optional值

时间:2016-10-17 12:49:36

标签: ios swift optional

是的,另一个在解包可选值错误时找到了nil。我已经阅读了大量其他类似错误的堆栈溢出帖子,例如 this 一个和其他许多。我仍然不完全明白如何妥善处理展开变量。

我有一个类似于以下的类:

@IBOutlet weak var nameTextField: UITextField?
@IBOutlet weak var valueInput: UITextField?

var checkbox : CheckBox?

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    let name = nameTextField.text ?? ""
    let state = buttonState.getIsChecked()
    let value : Int? = Int(valueInput.text!)
    let isMoveable = true

    checkbox = CheckBox(name: name, value: value, state: state, isMoveable: isMoveable)
}

我在“let value:Int?= Int(valueInput.text!)”行的行中得到错误。

2 个答案:

答案 0 :(得分:2)

您可以使用if let construct

安全地展开值
var value : Int? = nil 

if let val = valueInput.text {
  value = Int(val) // it would either nil or optional value
}

您也可以通过nil coalescing operator ??在一行中完成

let value : Int? = Int(valueInput.text ?? "")

<强>更新

首先检查文本字段是否与Interface Builder断开连接,如果没有连接,请连接它们。如果你成为你的textfields选项,你还必须安全地打开文本字段(你忘了从界面构建器中添加它,如果你把它们作为选项,它就不会崩溃)。

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

var name: String? = nil
var value : Int? = nil
let state = buttonState.getIsChecked()
let isMoveable = true


if let nameTextField = self.nameTextField where nameTextField.text != nil {
  name = nameTextField.text!
}

if let valueTextField = self.valueInput where valueTextField.text != nil {
  value = Int(valueTextField.text!)
}

 checkbox = CheckBox(name: name, value: value, state: state, isMoveable: isMoveable)

}

答案 1 :(得分:0)

Sahil的回答正在进行中,但并未解决valueInput也是可选的问题。使用此代码:

if let valueInput = valueInput,
    let val = valueInput.text {
    value = Int(val)
}

另外,如果要正确展开可选的valueInput,我想补充一点,如果valueInputIBOutlet,则可能会将其定义为:

@IBOutlet weak var valueInput: UITextField!

这称为隐式解包的可选项。令人讨厌的是,因为它也是IBOutlet,如果它与Interface Builder中的UITextField断开连接,变量将变为零,并且从代码中的任何位置访问它将导致崩溃

将其更改为:

@IBOutlet weak var valueInput: UITextField?

我也在我的博客上写过:http://cleanswifter.com/implicitly-unwrapped-iboutlets/

注意:您没有显示valueInput的定义,所以我认为它是UITextField