swift - UITextField 在不是时被视为 nil
问题描述
我有一段代码旨在允许用户更改他们使用的重量单位。如果他们已经输入了一个值,它会自动在公斤和磅之间转换。它通过点击 UISegmentedControl 来更改,其中段 0 是千克,段 1 是磅。
无论用户是从公斤变为磅还是反之,都可以完美地更改第一次。但是,在尝试进行第二次转换时,程序立即崩溃,声称包含 weight 的文本字段中的值为零,即使它明确包含文本。
这是我现在的代码:
@IBAction func unitChanged(_ sender: UISegmentedControl) {
if let text = weightInput.text, text.isEmpty {
//Does nothing since there is no weight to change the unit of
}
else {
let weight: Int? = Int(weightInput.text!)
var weightDouble: Double = Double(weight!)
if (weightTypeInput.selectedSegmentIndex == 0) {
//The user is trying to change from pounds to kilograms
weightDouble = weightDouble * 0.45359237
}
else {
//The user is trying to change from kilograms to pounds
weightDouble = weightDouble * 2.2046226218
}
weightInput.text = String(weightDouble)
}
}
最后这是我收到的错误消息:
线程 1:致命错误:在展开可选值时意外发现 nil
如果我为 weightDouble 设置默认值,则它始终用于所有后续转换尝试。这里有没有人遇到过类似的问题?我试图在网上搜索,但找不到任何帮助。
解决方案
你确定你的 TextField 的文本值是 nil 吗?因为你只是在第一次检查它,如果我认为情况并非如此。
Int 无法解析带有浮点数的数字。执行此操作时返回 nil。您可能希望先将其解析为 Double,然后再将其转换为 Int。
我认为您的代码应如下所示:
@IBAction func unitChanged(_ sender: UISegmentedControl) {
guard let text = weightInput.text, !text.isEmpty, var weightDouble = Double(text) else { return }
if (weightTypeInput.selectedSegmentIndex == 0) {
//The user is trying to change from pounds to kilograms
weightDouble = weightDouble * 0.45359237
}
else {
//The user is trying to change from kilograms to pounds
weightDouble = weightDouble * 2.2046226218
}
weightInput.text = String(Int(weightDouble))
}
推荐阅读
- android - 如何在 Android 库项目中按测试类型分隔源文件?
- kubernetes-ingress - Nginx入口控制器速率限制不起作用
- python-2.7 - sqlite3 & python:获取主键和外键列表
- javascript - React-leaflet 如何动态更改矩形颜色?
- linux - 从用户空间读取非阻塞 i2c
- wordpress - 安装 nginx 和 wordpress 子文件夹的问题——永久链接不起作用
- python-3.x - 通过networkx着色节点
- java - 在 Windows 7、8 和 10 上检索所有当前安装的软件
- mule - 多个 DataWeave 函数中的优先级
- c++ - 错误:表达式不能用作函数