守卫让发现零

问题描述

我是守卫模式的新手。当selectedRooms.textnil而不是返回部分时,我的应用程序如何崩溃?当我知道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

UITextFieldUITextView始终返回String值。如果String中没有文本,则返回一个空的""UITextField and UITextView)。这就是else部分未执行且rooms值为nil的原因。

现在,在下面的语句中,您将!强制展开(rooms)。

x = Int(ceil(sqrt(Double(rooms!))))

但是,由于roomsnil,因此强制展开它会抛出运行时异常

解决方案:

您还需要添加一个空支票,以使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来使用