是的,另一个在解包可选值错误时找到了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!)”行的行中得到错误。
答案 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
,我想补充一点,如果valueInput
是IBOutlet
,则可能会将其定义为:
@IBOutlet weak var valueInput: UITextField!
这称为隐式解包的可选项。令人讨厌的是,因为它也是IBOutlet
,如果它与Interface Builder中的UITextField
断开连接,变量将变为零,并且从代码中的任何位置访问它将导致崩溃
将其更改为:
@IBOutlet weak var valueInput: UITextField?
我也在我的博客上写过:http://cleanswifter.com/implicitly-unwrapped-iboutlets/
注意:您没有显示valueInput
的定义,所以我认为它是UITextField