二元运算符'<&#;不能应用于' Double的类型的操作数?'和' Int'

时间:2017-11-12 13:55:56

标签: swift swift3

我试图检查一个数字是否小于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)
}

4 个答案:

答案 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,您的应用程序将崩溃。正如我所说,如果你绝对百分百肯定它可以转换。