目标C - 区分零和'没有价值'

时间:2013-03-15 06:18:18

标签: ios objective-c

我建立一个图表视图,我给它一个数据源,它可以要求一个Y值对应给定的X索引。在某些情况下,给定的X索引没有Y值。在这种情况下我不能发送nil,因为0可能是完全有效的Y值。客观C中最好的方式是沟通什么都没有价值?

5 个答案:

答案 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有点尴尬。