如果比较CGFloat值 - Xcode 7给出错误

时间:2015-10-02 20:18:28

标签: ios objective-c xcode xcode7 cgfloat

我有以下代码:

 @property (nonatomic, assign) CGFloat floatValue;

-

 if (floatValue)
 {
    //Do something
 }

由于Xcode 7 - 发生编译错误:

  

隐式转换将浮点数转换为整数:' CGFloat'到' bool'

任何人都可以解释正在进行/建议的代码编辑以纠正

3 个答案:

答案 0 :(得分:6)

这取决于如何实现从CGFloat到Bool的强制转换。这可能取决于Objective-C的实现,甚至取决于实际处理器对IEEE浮点规范的实现。

无论哪种方式,你绝对不应该依赖它。特别是因为浮子不能保证准确。你最终会得到一些非常接近0的东西,但if语句会失败。

您应该根据您要查找的值显式测试浮点数:

if (floatValue != 0.0f)
{
    //we know exactly what will happen
}

在Swift中,编译器甚至不会让你做这样的事情,因为它试图让你安全:

if (floatValue)
{
    //might happen, might not. who knows
}

在Swift中,如果if (variable)的类型为Bool,则只能使用variable语法。

Objective-C编译器不会强迫您进入此行为,但如果您希望代码以可预测的方式运行并且可移植,则应遵守它。

答案 1 :(得分:2)

您需要明确询问floatValue是否等于0.0,或者更好的是,它的绝对值是否小于某个可接受的epsilon(例如0.000001)。

或者说,或者只是通过明确地强制转换为NSInteger来截断 - 但这将是相当愚蠢的,因为0.9最终会为0。

答案 2 :(得分:0)

  

隐式转换将浮点数转换为整数:   'CGFloat'到'bool'

值得一提的是,这里的CGFloat正在被转换(至少试图成为)bool而不是BOOL。这基本上是因为事情发生在ARM64上(见https://www.bignerdranch.com/blog/bools-sharp-corners/)。正如上面的人所说,有必要明确地与“零的绝对值”进行比较。但是,这并不总是意味着要比较0.0f或0.0(参见这篇文章:https://stackoverflow.com/a/10334944/2799410)。 BTW,matt刚刚指出,与阈值相比,与仅比较0.0和/或0.0f相比,这是一个更好的想法。