0

我正在构建一个图表视图,我给它一个数据源,它可以请求一个与给定 X 索引相对应的 Y 值。在某些情况下,给定的 X 索引没有 Y 值。在这种情况下我不能发送 nil,因为 0 可能是一个完全有效的 Y 值。在目标 C 中传达根本没有价值的最佳方式是什么?

4

5 回答 5

3

在我看来,您正在使用某种对象在模型和视图之间发送数据,也许NSNumber,它持有一个值,并且您正在通过向其发送消息来检索该值,并且您知道如果对象是nil,消息发送将返回0

这是正确的。在这种情况下,只需检查对象是否为nil,然后相应地继续:

- (void)plotValue:(NSNumber *)number
{
    if (number == nil) {
        // no value
    } else {
        // Value may be 0, but you can now safely plot it.
    }
}
于 2013-03-15T06:22:42.503 回答
2

nil不是0。它们是不同的。

如果您正在使用NSNumber,则nil显然与 的集合不相交NSNumber

如果您正在使用int,那么您将无法使用nil.

于 2013-03-15T06:19:24.967 回答
2

不要在数据源中使用原语,而是使用 NSNumber。然后,您可以区分 nil 和存储值 0 的 NSNumber。

于 2013-03-15T06:24:25.877 回答
1

如果您不想使用对象 ( NSNumber),您可以返回一个负数(如果可能)或数据源不太可能返回的最大/最小整数。

于 2013-03-15T06:31:08.053 回答
0

我假设你在谈论一些像 NSInteger 之类的标量。如果从字面上看,任何整数对于 Y 值都是有效的,那么就没有办法做到这一点。但是,很可能存在一些实用范围,因此您可以选择该范围之外的一些值来“特殊”。例如,Cocoa 有 value NSNotFound,如果你请求一个不在数组中的对象的索引,NSArray 将返回这个值。它被定义为最大可能的 NSInteger。如果你的 Y 值永远不会是 NSIntegerMax,你可以自己重用它。

另一个选项,假设您不想为此创建特殊类型,将让您的方法返回 Y 以及是否实际找到 Y。例如,一些粗略的伪代码:

- (NSInteger)yForX:(NSInteger)x wasFound:(BOOL *)found {
    if (yWasFound) {
        if (found) 
            *found = YES;
        return y;
    } else {
        if (found)
            *found = NO;
        return 0;
    }
}

You could use NSNumber, as some have suggested, but I find it a little awkward to deal in NSNumbers just to get nil.

于 2013-03-15T06:37:42.117 回答