问题描述
我是守卫模式的新手。当selectedRooms.text
为nil
而不是返回部分时,我的应用程序如何崩溃?当我知道rooms
不是numberOfRooms
时,为什么nil
是可选类型?
guard let numberOfRooms = selectedRooms.text else {
return selectedRooms.placeholder = "type something"
}
let rooms = Int(numberOfRooms)
x = Int(ceil(sqrt(Double(rooms!)))) //found nil value
解决方法
selectedRooms.text
无法返回nil
。
UITextField
和UITextView
始终返回String
值。如果String
中没有文本,则返回一个空的""
(UITextField and UITextView
)。这就是else
部分未执行且rooms
值为nil
的原因。
现在,在下面的语句中,您将!
强制展开(rooms
)。
x = Int(ceil(sqrt(Double(rooms!))))
但是,由于rooms
是nil
,因此强制展开它会抛出运行时异常。
解决方案:
您还需要添加一个空支票,以使else
部分生效,即
guard let numberOfRooms = selectedRooms.text,!numberOfRooms.isEmpty else { //here...
return selectedRooms.placeholder = "type something"
}
,
guard let numberOfRooms = selectedRooms.text?.trimmingCharacters(in: .whitespacesAndNewlines),!numberOfRooms.isEmpty else {
return selectedRooms.placeholder = "type something"
}
if let rooms = Int(numberOfRooms) {
x = Int(ceil(sqrt(rooms)))
}
您不想强行打开numberOfRooms的值,可以通过检查let来使用