Xcode中发现输出如下报错:
Error: this application, or a library it uses, has passed an invalid numeric value (NaN, or not-a-number) to CoreGraphics API and this value is being ignored. Please fix this problem.
If you want to see the backtrace, please set CG_NUMERICS_SHOW_BACKTRACE environmental variable.
经过查询了解到这个说明传给 CoreGraphics(苹果的绘图系统)的数值是非法的:NaN(Not-a-Number),比如:0.0 / 0.0、sqrt(-1)、log(-10),还有任何未初始化的 Double、CGFloat,或非法计算值。
实际上这个报错并没有什么影响,可能会导致折线图显示有问题。
问题原因
具体来讲就是,存在一个数值为NaN,在绘图过程中,有个数字是 NaN(不是一个有效数字),比如 CGPoint(x: NaN, y: 100)。
这类错误通常不会导致程序崩溃,但会导致UI 不正常或图表错位/不显示。
排查方案
因为我这里涉及到一些计算流程,因此主要还是查看被除数为0的问题:
修改代码1:
for userCurrency in userForeignCurrencies {
if let symbol = userCurrency.symbol, let rate = rateDict[symbol],let localCurrency = rateDict[appStorage.localCurrency]{ // 修改前
total += userCurrency.amount / rate * localCurrency
}
}
for userCurrency in userForeignCurrencies {
if let symbol = userCurrency.symbol, let rate = rateDict[symbol],let localCurrency = rateDict[appStorage.localCurrency] ,rate > 0, localCurrency > 0 { // 修改后
total += userCurrency.amount / rate * localCurrency
}
}
修改代码2:
func normalize(_ value: Double, min: Double, max: Double) -> Double {
return (value - min) / (max - min)
}
func normalize(_ value: Double, min: Double, max: Double) -> Double {
guard max != min else { return 0 } // 新增代码
return (value - min) / (max - min)
}
排查了很多代码,上面两个示例代码是比较典型的,我通过判断来防治被除数出现为0的情况。
最后重新运行代码,不再报错。
总结
这类问题可能还是影响绘图多一些,如果排查代码很复杂,可以先搁置到后续处理。
后续的开发过程中,在判断代码时,应该考虑到这种场景,通过 > 0等判断防止出现特殊情况。