Ios 目标C-区分无价值和“无价值”
我正在构建一个图表视图,并给它一个数据源,它可以向它请求一个对应于给定X索引的Y值。在某些情况下,给定的X索引没有Y值。在这种情况下,我不能发送nil,因为0可能是一个完全有效的Y值。在目标C中,传达根本没有价值的最佳方式是什么?nil不是0。他们是不同的 如果您使用的是NSNumber,那么nil显然与NSNumber集合不相交Ios 目标C-区分无价值和“无价值”,ios,objective-c,Ios,Objective C,我正在构建一个图表视图,并给它一个数据源,它可以向它请求一个对应于给定X索引的Y值。在某些情况下,给定的X索引没有Y值。在这种情况下,我不能发送nil,因为0可能是一个完全有效的Y值。在目标C中,传达根本没有价值的最佳方式是什么?nil不是0。他们是不同的 如果您使用的是NSNumber,那么nil显然与NSNumber集合不相交 如果您使用int,那么就不能使用nil。在我看来,您正在使用某种对象(可能是NSNumber)在模型和视图之间发送数据,该对象持有一个值,您正在通过发送消息来检索该值
如果您使用int,那么就不能使用nil。在我看来,您正在使用某种对象(可能是NSNumber)在模型和视图之间发送数据,该对象持有一个值,您正在通过发送消息来检索该值,并且您知道,如果该对象为nil,则消息send将返回0 没错。在这种情况下,只需检查对象是否为nil,然后进行相应的操作:
- (void)plotValue:(NSNumber *)number
{
if (number == nil) {
// no value
} else {
// Value may be 0, but you can now safely plot it.
}
}
不要在数据源中使用原语,而是使用NSNumber。然后您可以区分nil和存储值0的NSNumber。如果您不想使用对象NSNumber,您可以在可能的情况下返回负数,或者返回数据源不太可能返回的最大/最小整数。我假设您谈论的是一些标量,比如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,但我发现仅仅为了得到nil而使用NSNumber有点尴尬。除了在Objective-C++中,nil被定义为0。@H2CO3:它被定义为u null。@DietrichEpp一直遵循定义,直到找到根定义为止。最终,它是0或0的某些类型。@DietrichEpp按照宏展开。反过来,这就是uu DARWIN _NULL或类似的值,如果定义了u cplusplus,则为0;如果没有定义,则为void*0。@H2CO3:我告诉你,即使在所有宏都展开之后,它也是u NULL。我可能会反过来做,返回BOOL并使用名为getYForX的方法:。大多数名为get的方法表示调用方提供的缓冲区,如果此类方法可能失败,则许多名为get的方法返回BOOL表示成功或失败。