警卫让我们找到零

guard let found nil

我是 guard let 模式的新手。当 selectedRooms.textnil 而不是执行 return 部分时,我的应用程序为什么会崩溃?当我知道 numberOfRooms 不是 nil 时,为什么 rooms 是可选类型?

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 不能 return nil.

一个UITextFieldUITextView总是return一个String值。如果 UITextField and UITextView 中没有文本,则会 return 编辑空的 String ("")。这就是 else 部分未执行且 rooms 值为 nil.

的原因

现在,在下面的语句中你是 force-unwrapping(!) 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 的值,您可以通过检查 if let

来使用