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

Ron*_*mer 2 xcode objective-c cgfloat ios xcode7

我有以下代码:

 @property (nonatomic, assign) CGFloat floatValue;
Run Code Online (Sandbox Code Playgroud)

-

 if (floatValue)
 {
    //Do something
 }
Run Code Online (Sandbox Code Playgroud)

自Xcode 7 - 编译器错误发生:

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

任何人都可以解释什么是/建议代码编辑来纠正

tan*_*101 6

这取决于如何实现从CGFloat到Bool的演员表.这可能取决于Objective-C的实现,甚至取决于实际处理器对IEEE浮点规范的实现.

无论哪种方式,你绝对不应该依赖它.特别是因为浮子不能保证准确.你可能会得到令人难以置信的接近0的东西,但if语句会失败.

您应该根据您要查找的值显式测试浮点数,如下所示:

if (floatValue != 0.0f)
{
    //we know exactly what will happen
}
Run Code Online (Sandbox Code Playgroud)

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

if (floatValue)
{
    //might happen, might not. who knows
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 浮点数恰好为0的二进制表示形式为0。在这种情况下,此测试将通过。如果尝试检查一个接近0的值,则应使用>和< (2认同)
  • 无论哪种方式,依靠被截断的尾数都不是一个好主意. (2认同)
  • 对不起,事实证明,我对`if`条件中`float`的Objective-C解释的看法是错误的.我将在约30分钟内移除downvote(它现在被锁定).我以为它被转换为int(BOOL在下面表示为int,AFAIK).但是我进行了一些实验,似乎它对待任何不等于"0.0"的东西,如"YES".我想,`1e-30`应该产生'NO`.但这是一个"是".很明显,我没有足够的能力在这个问题上投票:) (2认同)