如何区分未设置的浮点数和值为0的浮点数?

时间:2012-04-17 02:19:13

标签: objective-c undefined equality cgfloat

我有一个方法,当给定一个未设置的浮点数而不是一个值为0的浮点数时,需要做一个不同的事情。基本上,我需要检查一个变量是否已经存在,如果它有一个变量,则将它计算为set值为0.

所以,我应该使用哪个占位符作为未设置值(nil,NULL,NO等)和如何测试以查看变量是否未设置而不返回如果值为0,则为true?

3 个答案:

答案 0 :(得分:16)

您可以将浮动内容初始化为NaN(例如,通过调用nan()nanf()),然后使用isnan()进行测试,如果它们已更改为保留数字。 (请注意,测试myvalue == nan()工作。)

这很简单(在任何情况下你都可能包括math.h)并且在概念上是明智的:任何未设置为数字的值都是“不是数字”......

答案 1 :(得分:3)

当变量合法地获得该常量的值时,使用常量值来指示未设置状态通常会导致错误。

考虑使用NSNumber存储您的浮动广告。这样它不仅可以nil,而且会默认为该状态。

这假设您只需要少量浮动。如果您需要数百万,NSNumber可能太慢并且内存密集。

答案 2 :(得分:2)

不是重载这些float属性(让他们称之为X和Y),而是为每个属性创建一个单独的isValid标志。初始化标志以指示尚未设置浮动,并提供您自己的设置器以适当地管理标志。因此,您的代码可能类似于:

if (self.isXValid == YES) {
    self.Y = ... // assigning to Y sets isYValid to YES
}
else if (self.isYValid == YES) {
    self.X = ... // assigning to Y sets isXValid to YES
}

你实际上可以更进一步,让X的setter也分配Y,反之亦然。或者,如果X和Y如此紧密地链接,您可以根据另一个的值计算一个,那么您实际上只需要一个变量用于两个属性。