我有以下代码:
@property (nonatomic, assign) CGFloat floatValue;--
if (floatValue)
{
//Do something
}由于Xcode 7-编译器发生错误:
隐式转换将浮点数转换为整数:“CGFloat”到“bool”。
有人能解释一下正在进行的/建议的代码编辑来纠正吗?
发布于 2015-10-02 21:13:20
这取决于如何实现从CGFloat到Bool的转换。这可能取决于Objective的实现,甚至取决于实际处理器对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编译器不会强迫您进行这种行为,但是如果您希望代码能够以可预测的方式运行并且是可移植的,那么您应该遵守它。
发布于 2015-10-02 20:20:40
您需要明确地询问floatValue是否等于0.0,或者更好的是,它的绝对值是否小于某些可接受的epsilon (例如0.000001)。
或者直接强制使用NSInteger来截断--但这是相当愚蠢的,因为0.9将以0结尾。
发布于 2015-10-02 21:48:57
隐式转换将浮点数转换为整数:“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与treshold相比较比仅将其与0.0和/或0.0f相比较要好得多。
https://stackoverflow.com/questions/32915224
复制相似问题