ios - 线程 1:EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0) 当字符超过
问题描述
我知道有关于这个例外的答案,但没有什么对我有用。
我的代码工作正常,我必须将文本字段的文本转换为Int
,但现在我注意到当我输入超过 10 个字符时它会崩溃。
我已将这些文本字段的字符限制设置为 11,但它在最后一个数字上崩溃并出现错误:线程 1:EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)。
这是代码
@IBAction func Qty_EndEdit(_ sender: Any) {
print("For Total Cost")
if QtyText.text != ""{
if UnitPriceText.text != "" {
TotalCostText.text = String((QtyText.text?.numberValue)! * (UnitPriceText.text?.numberValue)!)
}
}
}
@IBAction func UnitPrice_EndEdit(_ sender: Any) {
print("For Total Cost")
if QtyText.text != ""{
if UnitPriceText.text != "" {
TotalCostText.text = String((QtyText.text?.numberValue)! * (UnitPriceText.text?.numberValue)!)
// CRASHING ON THE ABOVE LINE
}
}
}
extension String {
var numberValue:Int? {
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
return formatter.number(from: self) as! Int
}
}
解决方案
您的崩溃与Int
乘法无法处理此类数字有关,请使用Double
.
您的两个操作都做同样的事情,尝试将要重用的代码放在func
.
您还需要查看选项以及如何使用它们。这是一个例子。
func updateTotalCost() {
if let quantity = Double(QtyText.text ?? ""),
let unitPrice = Double(UnitPriceText.text ?? "") {
TotalCostText.text = String(quantity * unitPrice)
} else {
// ???
TotalCostText.text = ""
}
}
@IBAction func Qty_EndEdit(_ sender: Any) {
updateTotalCost()
}
@IBAction func UnitPrice_EndEdit(_ sender: Any) {
updateTotalCost()
}
我将剖析其中的一些:
QtyText.text ?? ""
-> 如果 QtyText.text 为 nil,则将其替换为空字符串,否则使用 QtyText.text 中的值
Double(QtyText.text ?? "")
-> 构建一个Double from a
字符串, which is guaranteed non-nil (since we forced it to be an empty
String`,即使在 QtyText.text 为 nil 的情况下)
Double()
如果传递给构造函数的字符串未计算为有效值Double
(例如,String
“abcd”不能计算为),则此构造函数本身可能返回 nil Double
。因此,我们将其包装在一个if let
语句中,以保护自己免受Double()
构造函数无法Double
从我们的String
:
if let quantity = Int(QtyText.text ?? "")
这告诉编译器:
仅当我在数量变量中放置的内容不为零时,才将其评估为 true。
最后,我们用逗号链接两个 if 语句:
if let quantity = Int(QtyText.text ?? ""),
let unitPrice = Int(UnitPriceText.text ?? "") {
在这部分if
语句中,我们将保证数量和单位价格都是有效Doubles
的,并且我们可以执行计算。
我不确定您是否会对结果感到满意,String(myDoubleNumber)
但是您应该研究数字格式以获得您想要的结果。
推荐阅读
- android - 当我单击标题栏上的后退箭头而不是转到上一个面板时,它会退出应用程序吗?
- javascript - 在函数内部的另一个 if 条件中读取变量的值
- spring - 在引导弹簧启动时从领事读取值
- laravel - 用于控制用户访问数据的 Laravel 中间件
- listview - 颤动是否尊重父母的边界半径?
- php - 我的问题是关于通过 PHP Quickstart 实现白名单
- android - 日历事件已在 Android 手机上删除,但未在网络 Google 议程中删除
- build - 如何在 Bazel 中生成当前包之外的文件
- python-3.x - 树中不同路径的数量,该路径中节点的值大于或等于 K
- thymeleaf - 为什么“href”和“th:href”同时存在?