我正在构建一个图表视图,我给它一个数据源,它可以请求一个与给定 X 索引相对应的 Y 值。在某些情况下,给定的 X 索引没有 Y 值。在这种情况下我不能发送 nil,因为 0 可能是一个完全有效的 Y 值。在目标 C 中传达根本没有价值的最佳方式是什么?
5 回答
在我看来,您正在使用某种对象在模型和视图之间发送数据,也许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.
}
}
nil
不是0
。它们是不同的。
如果您正在使用NSNumber
,则nil
显然与 的集合不相交NSNumber
。
如果您正在使用int
,那么您将无法使用nil
.
不要在数据源中使用原语,而是使用 NSNumber。然后,您可以区分 nil 和存储值 0 的 NSNumber。
如果您不想使用对象 ( NSNumber
),您可以返回一个负数(如果可能)或数据源不太可能返回的最大/最小整数。
我假设你在谈论一些像 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.