【问题标题】:Crash on Float to Int conversionFloat 到 Int 转换时崩溃
【发布时间】:2019-12-20 18:53:14
【问题描述】:

我的实时应用在 Float 到 Int 转换线上随机崩溃。

我无法弄清楚它为什么会崩溃并且无法重现它,因为它是实时应用程序上的随机崩溃。有关如何修复崩溃的任何建议?

崩溃日志

Crashed: com.apple.main-thread
0  MyApp                0x100703778 closure #1 in MyViewController.getBalance(isRefreshed:) + 797 (MyViewController.swift:797)
1  MyApp                0x1005c7670 closure #1 in closure #1 in fetchtBalance(completed:) + 185 (Utils.swift:185)
2  MyApp                0x10051ab10 thunk for @escaping @callee_guaranteed () -> () + 4335790864 (<compiler-generated>:4335790864)
3  libdispatch.dylib              0x1ae908b7c _dispatch_call_block_and_release + 32
4  libdispatch.dylib              0x1ae909fd8 _dispatch_client_callout + 20
5  libdispatch.dylib              0x1ae915cc8 _dispatch_main_queue_callback_4CF + 968
6  CoreFoundation                 0x1aebdee0c __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 16
7  CoreFoundation                 0x1aebd9b68 __CFRunLoopRun + 1980
8  CoreFoundation                 0x1aebd9084 CFRunLoopRunSpecific + 480
9  GraphicsServices               0x1b8e27534 GSEventRunModal + 108
10 UIKitCore                      0x1b2d49670 UIApplicationMain + 1940
11 MyApp                0x1004ec6b8 main + 20 (ClientMyProfileViewController.swift:20)
12 libdyld.dylib                  0x1aea58e18 start + 4

代码

import UIKit

var balance: String!
var cost: String?

func getBalance () {
    fetchBalance() { (result, error) in
        guard let balanceFloatValue = Float(balance!) else {
            print("Error")
            return
        }

        guard let costFloat = Float(cost!) else {
            print("Error")
            return
        }

        let costPerSec = costFloat / 60

        let talkTime = balanceFloatValue / costPerSec

        let talkTimeInt = Int(talkTime) // Line No. 797  Crash here

        // ....
    }
}

【问题讨论】:

  • 您也应该向我们展示错误,错误可能不存在,您的代码不会因这些值而崩溃。
  • 除了像这样将calculate() 放在文件中不会编译这一事实之外,这似乎很好。在 Playground 中运行它(并将 calculate() 放在函数的声明之后)可以工作。我看到的潜在崩溃是,如果您切换 talkTime 中的操作数,您将收到“除以零”错误。
  • 在这种情况下尽量避免强制展开可选可能会有所帮助
  • 错误不在代码的那部分。我们需要更多信息来查找错误,完整的错误消息将帮助我们至少检查它是否与代码的特定部分有关。你不能粘贴整个错误信息吗?如果它只在实时应用程序上,你不能记录值吗?同时记录堆栈跟踪。
  • 附带说明:不要将Float 用于货币。这些是您会遇到的问题。

标签: ios swift floating-point int


【解决方案1】:

这个错误最可能的原因是值本身

let a:Float = 9999999999999999999999.9
let b = "0.000000000000000000001"
let c:Float = a/Float(b)!
let x = Int(c)  // <- Crash here

0/0 会让你崩溃: let c:Float = a/Float(b)!所以不是这样,但是任何其他可以使talkTime在 Int 之外的东西都会让你崩溃 这也可以解释为什么您只会随机遇到错误,因为它仅适用于使该除法 NaN 或 inf 或 int 之外的东西(如 bg2b 所说的)

【讨论】:

  • 你可能是对的,因为我想不出别的了。我假设我必须检查 isNaN 的通话时间?
  • 你应该检查 NaN ,talkTime 应该小于 Int.Max 并且大于 Int.Min 也
  • 好的,tx 寻求帮助。
  • 这是错误的:Int(talkTime) ?? 0 这样您就可以使用默认值停止崩溃(如果转换失败,它将使用 0 或您在那里使用的任何值)忘记这个
  • Int(talkTime) ?? 0 给出警告,这是显而易见的。 => nil 合并运算符 '??' 的左侧具有非可选类型“Int”,因此从不使用右侧。
【解决方案2】:

我认为您是在强制解开余额值。尝试解开转换后的值,例如:“Float(balance)!”

【讨论】:

    【解决方案3】:

    您可以像这样快速将浮点值转换为整数值:

    var myIntValue = Int(myFloatValue)

    【讨论】:

      猜你喜欢
      • 2016-09-01
      • 2011-09-28
      • 2018-03-11
      • 2021-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多