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

Ios 如果比较CGFloat值-Xcode 7给出错误,ios,objective-c,xcode,xcode7,cgfloat,Ios,Objective C,Xcode,Xcode7,Cgfloat,我有以下代码: @property (nonatomic, assign) CGFloat floatValue; -- 由于发生Xcode 7-编译器错误: 隐式转换将浮点数转换为整数:“CGFloat”转换为“bool” 有人能解释一下正在进行的/建议进行的代码编辑以进行纠正吗?你需要明确询问floatValue是否等于0.0,或者更确切地说,它的绝对值是否小于一些可接受的ε(例如0.000001) 要么是这样,要么就是通过显式强制NSInteger来截断-但那将是相当愚蠢的,因为0.9

我有以下代码:

 @property (nonatomic, assign) CGFloat floatValue;
--

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

隐式转换将浮点数转换为整数:“CGFloat”转换为“bool”


有人能解释一下正在进行的/建议进行的代码编辑以进行纠正吗?你需要明确询问
floatValue
是否等于0.0,或者更确切地说,它的绝对值是否小于一些可接受的ε(例如0.000001)


要么是这样,要么就是通过显式强制NSInteger来截断-但那将是相当愚蠢的,因为0.9最终将变成0。

这取决于如何实现从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中,如果变量为Bool类型,则只能使用
if(variable)
语法

Objective-C编译器不会强迫您执行此行为,但是如果您希望代码能够以可预测的方式运行并具有可移植性,那么您应该遵守它

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

同样重要的是,这里的CGFloat正在转换(至少尝试转换)为bool而不是bool。这基本上是因为事情发生在ARM64上(请参阅)。正如上面提到的,有必要明确地与“零的绝对值”进行比较。然而,这并不总是意味着与0.0f或0.0进行比较(请参阅本文)。
顺便说一句,matt刚刚指出,与0.0和/或0.0f相比,用treshold与零进行比较是一个更好的主意。

因此,从下面的答案来看,苹果似乎在试图防止不良做法(即非布尔类型的if(x)),但为了让我能够正确修改if(floatValue)如果floatValue为零,则仅返回false?现有代码如何处理?类似的情况可能有数千种。
if(floatValue==0.0f)
正好为0的浮点的二进制表示为0。这种情况下,这项测试将通过。如果您试图检查接近0的值,那么您应该使用>,无论哪种方式,依靠尾数被截断都不是一个好主意。抱歉,事实证明,我对
If
条件中
float
s的Objective-C解释是错误的。我将在约30分钟内移除否决票(现在已锁定)。我认为它被转换为int(BOOL在下面表示为int,AFAIK)。但是我做了一些实验,它似乎把任何不等于
0.0
的东西都当作
YES
。我想,
1e-30
应该产生
NO
。但这是一个
是的
。很明显,我没有能力在这个问题上投票:)FYI-
如果(floatValue)
需要是
如果(floatValue!=0.0f)
,而不是
如果(floatValue==0.0f)
。答案很合理。为什么会有人对它嗤之以鼻?那么在Xcode 7之前运行良好的现有代码呢?
if (floatValue)
{
    //might happen, might not. who knows
}