【问题标题】:Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0) When Characters Exceed线程 1:EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0) 当字符超过
【发布时间】:2019-01-13 15:34:12
【问题描述】:

我知道有关于此异常的可用答案,但对我没有任何帮助。

我的代码工作正常,我必须将文本字段的文本转换为 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
    }
}

【问题讨论】:

  • QtyTextUnitPriceText 是什么?您的numberValue 字符串属性的实现是什么?
  • 请花时间学习如何正确使用可选选项。将?! 结合起来真的没有意义。
  • @YannickLoriot 这是两个文本字段,通过 numberValue 我从 String 中获取 Int。
  • @YannickLoriot 并且只有在文本字段中输入最后一个(第 11 个)字符时才会崩溃,否则它计算正常并在 TotalCost 字段中显示结果
  • @rmaddy 我了解选项,但文本字段不为空,这就是我强制展开的原因。

标签: ios swift exception type-conversion


【解决方案1】:

您的崩溃与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 aString, which is guaranteed non-nil (since we forced it to be an emptyString`,即使在 QtyText.text 为 nil 的情况下)

如果传递给构造函数的字符串未计算为有效的Double(例如,String“abcd”不能计算为 Double),则此 Double() 构造函数本身可能返回 nil。因此,我们将其包装在 if let 语句中,以保护自己免受 Double() 构造函数未能从我们的 String 构建 Double 的影响:

    if let quantity = Int(QtyText.text ?? "")

这是告诉编译器:

仅当我在数量变量中放置的内容不为零时才将其评估为 true。

最后,我们用逗号链接两个 if 语句:

    if let quantity = Int(QtyText.text ?? ""),
        let unitPrice = Int(UnitPriceText.text ?? "") {

if 语句的这一部分中,我们将保证数量和单位价格都是有效的Doubles,并且我们可以执行计算。

我不确定您是否会对 String(myDoubleNumber) 的结果感到满意,但您应该研究数字格式以获得您想要的结果。

【讨论】:

  • 它仍然在我乘法的那一行崩溃,TotalCostText.text = String(quantity * unitPrice) 有同样的异常!
  • 我了解可选选项,但文本字段不为空,这就是我强制展开的原因。
  • 只有在文本字段中输入最后一个(第 11 个)字符时才会崩溃,否则它会计算正常并在 TotalCost 字段中显示结果。
  • 你正在崩溃,因为你溢出了 Int 能够处理的内容。请改用 Double。我已经编辑了我的答案。
  • 我太愚蠢了,我完全忘记了这一点,试图使用 Int64 代替,我的错。谢谢。
猜你喜欢
  • 1970-01-01
  • 2016-05-13
  • 1970-01-01
  • 2015-10-19
  • 2016-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多