【问题标题】:IF comparison on CGFloat value - Xcode 7 gives errorIF 比较 CGFloat 值 - Xcode 7 给出错误
【发布时间】:2015-10-02 20:18:27
【问题描述】:

我有以下代码:

 @property (nonatomic, assign) CGFloat floatValue;

--

 if (floatValue)
 {
    //Do something
 }

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

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

谁能解释发生了什么/建议修改代码以纠正

【问题讨论】:

  • 因此,从下面的答案看来,Apple 正试图防止不良做法(即 if(x) 在非布尔类型上) - 但这样我就可以正确修改 - if(floatValue) 只有如果 floatValue 为零则返回 false ?
  • 现有代码有什么用?这样的条件可能有数千个。

标签: ios objective-c xcode xcode7 cgfloat


【解决方案1】:

这取决于从 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 中,如果 variable 是 Bool 类型,您只能使用 if (variable) 语法。

Objective-C 编译器不会强迫您采取这种行为,但如果您希望代码可预测地运行并具有可移植性,您应该遵守它。

【讨论】:

  • if (floatValue == 0.0f) == 比较。
  • 正好为 0 的浮点数的二进制表示为 0。该测试将通过这种情况。如果您尝试检查接近 0 的值,则应使用 > 和
  • 无论如何,依赖尾数被截断并不是一个好主意。
  • 抱歉,事实证明,我在 if 条件下对 floats 的 Objective-C 解释是错误的。我将在大约 30 分钟内删除反对票(现在已锁定)。我认为它已转换为 int(BOOL 在下面表示为 int,AFAIK)。但是我进行了一些实验,它似乎将任何不等于0.0 的东西都视为YES。我想,1e-30 应该产生NO。但它是YES。显然我没有足够的能力在这个问题上投票:)
  • 仅供参考 - if (floatValue) 需要是 if (floatValue != 0.0f),而不是 if (floatValue == 0.0f)
【解决方案2】:

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

要么是这样,要么只是通过显式强制转换为 NSInteger 来截断——但这太愚蠢了,因为 0.9 最终会变成 0。

【讨论】:

  • 这个答案相当有道理。为什么会有人拒绝它?
  • Xcode 7 之前运行良好的现有代码呢?
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-07
    • 1970-01-01
    • 2015-09-08
    • 1970-01-01
    • 2016-11-18
    • 2013-10-14
    • 2014-10-23
    相关资源
    最近更新 更多