【问题标题】:What is the equivalent of NSNotFound for floats花车的 NSNotFound 等价物是什么
【发布时间】:2014-12-12 15:23:03
【问题描述】:

如果我有一个返回 CGFloat 的方法并且该方法找不到预期的数字,我想返回类似 NSNotFound 的东西,但那是一个 NSInteger。

这方面的最佳做法是什么?

【问题讨论】:

  • 也许CGFLOAT_MAXCGFLOAT_MIN 对你有用。
  • 关于DBL_MINFLT_MINCGFLOAT_MIN 的警告:也许违反直觉,它们不是您通常认为的“最低限度”可能的值,而是“可以由该类型表示的最小 量”。如果您想要“最负”/“最小”值,请使用 -DBL_MIN-FLT_MIN-CGFLOAT_MIN

标签: ios objective-c nsinteger cgfloat


【解决方案1】:

您可以使用不是数字 (NaN)。

请参阅nan()nanf()isnan()

但是对于这些问题,没有明确定义的非值(整数更糟糕),那么我更喜欢使用以下方法语义:

- (BOOL)parseString:(NSString *)string
            toFloat:(CGFloat *)value
{
    // parse string here
    if (parsed_string_ok) {
        if (value)
            *value = parsedValue;
        return YES;
    }
    return NO;
}

【讨论】:

  • 使用NaN 作为标记值有各种陷阱,例如,如果将它传递到不期望它的API 中,最终可能会得到奇怪的意外结果。如果您将 NaN 值传递给它,CoreGraphics 会变得特别不开心(崩溃等)。为了安全起见,您最终必须检查每个可能返回 NaN 的调用的结果,此时,您不妨按照 @Droppy 的建议进行操作,并使用输出参数和 BOOL返回值。每次我使用 NaN 作为标记值时,我都希望我没有这样做。
  • @ipmcc 感谢您的意见。
  • 我认为 Nan 不是“iOS”的方式,所以它不是预期的,你不应该使用它。
  • 我实际上从未创建过自己的带有 out 参数的方法,但对于这种情况,它感觉非常合适。谢谢!
【解决方案2】:

一种非常简洁的方法是将其包装成一个 NSNumber:

- (NSNumber *)aFloatValueProbably
{
    CGFloat value = 0.0;
    if (... value could be found ...) {
        return @(value);
    }
    return nil;
}

然后您可以检查该函数是否为您不存在的值返回 nil。

【讨论】:

  • 我比我的回答更喜欢这个。
  • 这种方法的缺点显然是性能,因为(大多数)NSNumbers 是堆分配的。
  • 这是我首先做的,但是当方法计算一个 CGFloat 单元格的高度时,返回一个 NSNumber 感觉不对
  • 为什么需要计算“无效”单元格的高度?我想他们根本不应该出现。
  • 我正在获取单元格的缓存高度,如果尚未缓存单元格高度,我想让调用者知道
猜你喜欢
  • 1970-01-01
  • 2020-08-04
  • 2014-05-08
  • 2014-06-12
  • 1970-01-01
  • 2022-11-28
  • 1970-01-01
  • 2018-07-10
  • 2023-04-10
相关资源
最近更新 更多