我建立一个图表视图,我给它一个数据源,它可以要求一个Y值对应给定的X索引。在某些情况下,给定的X索引没有Y值。在这种情况下我不能发送nil,因为0可能是完全有效的Y值。客观C中最好的方式是沟通什么都没有价值?
答案 0 :(得分: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.
}
}
答案 1 :(得分:2)
nil
不是0
。他们是不同的。
如果您使用的是NSNumber
,那么nil
显然与NSNumber
的一组不相交。
如果您使用int
,则无法使用nil
。
答案 2 :(得分:2)
不要在数据源中使用原语,而是使用NSNumber。然后,您可以区分nil和存储值0的NSNumber。
答案 3 :(得分:1)
如果您不想使用对象(NSNumber
),则可以返回负数(如果可能)或最大/最小整数数据源不太可能返回。
答案 4 :(得分:0)
我假设你正在谈论像NSInteger之类的某些标量。如果字面上任何整数对Y值有效,则无法执行此操作。但是,最有可能存在一些实际范围,因此您可以选择此范围之外的某些值为“特殊”。例如,Cocoa具有值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;
}
}
你可以使用NSNumber,正如一些人所建议的那样,但我发现在NSNumbers中处理它只是为了获得nil有点尴尬。