首页 > 解决方案 > 线程 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
    }
}

标签: iosswiftexceptiontype-conversion

解决方案


您的崩溃与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 emptyString`,即使在 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)但是您应该研究数字格式以获得您想要的结果。


推荐阅读