【发布时间】: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