我试图检查一个数字是否小于0,并且收到错误
Binary operator '<' cannot be applied to operands of type 'Double?' and 'Int'
它适用于Xcode 8,但在我迁移到Xcode 9之后,它再也无法工作了。我有另一个项目使用完全相同的代码,并在Xcode 9中工作,我不知道为什么它不起作用。
这是代码
let percent = Double(data.percent)
if(percent==0){
cell.lblPercent.textColor = UIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 1.0)
} else if(percent<0){ // Binary operator '<' cannot be applied to operands of type 'Double?' and 'Int'
cell.lblPercent.textColor = UIColor(red: 0.92, green: 0.0, blue: 0.047, alpha: 1.0)
} else {
cell.lblPercent.textColor = UIColor(red: 0.11, green: 0.66, blue: 0.019, alpha: 1.0)
}
答案 0 :(得分:2)
这里的问题是percent
常量是可选的。 Swift 3删除了具有相同基本类型的可选和非可选之间的比较。 Int literal(0)和Double类型之间的转换是隐式的(所以这里不是问题)。
您可以打开可选项:
if let percent = percent, percent < 0 {
}
或使用??
运算符,如下所示:
if ((percent ?? 0) < 0) {
}
您还可以在percent
常量的定义中使用nil合并运算符(如果适合您的用例¹):
let percent = Double(data.percent) ?? 0
¹请注意,通过执行此操作,您将在百分比为nil
时更改程序流程(将执行percent==0
条件的第一个分支而不是最后一个else
分支)。
答案 1 :(得分:0)
如果无法将字符串解析为Double
,则Double.init
将返回nil
。将nil
与其他数字进行比较没有意义。你必须以某种方式解决这个选择,例如:
let percent = Double(data.percent) ?? 0
这实际上已经在Swift 3中发生了变化(见SE-0121)。我假设即使在Xcode 8中你仍然在使用Swift 2。
答案 2 :(得分:0)
如果仔细看看错误:
二元运营商&#39;&lt;&#39;不能应用于&#39; Double的类型的操作数?&#39;和&#39; Int&#39;
您正在尝试将可选值(Double?
)与非可选值(Int
)进行比较,因此调试器无法进行比较。
您可以使用guard
/ if let
构造取消包含可选值来解决此问题,或使用nil-coalescing运算符??
带警卫或如果让:
if let percent = Double(data.percent) {
textColor = .black
}
或提供默认值(如果可以解包)
let percent: Double = Double(data.percent) ?? 0
答案 3 :(得分:0)
&#34;百分比&#34;是通过将字符串转换为Double来创建的。这种转换显然会失败,例如,如果你的字符串包含&#34; abc&#34;。那么在较新的Swift版本中,Double之间的比较呢?并且不再允许使用Int。
在创建编译代码之前,您需要确定所需的结果。实现代码的最简单方法是
if let percent = Double(data.percent) {
// Your code goes here
} else {
// Code for the case that data.percent cannot be converted
}
如果您决定将非可转换数据视为零,那么您可以编写
let percent = Double(data.percent) ?? 0.0
这样,任何无法转换的东西都会变成零。显然,只有做正确的事情才能做到这一点。
如果您绝对百分之百确定数据可以转换,那么您可以写
let percent = Double(data.percent)!
现在&#34;%&#34;将不再是可选的。如果无法转换data.percent,您的应用程序将崩溃。正如我所说,如果你绝对百分百肯定它可以转换。