Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/110.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 目标C-区分无价值和“无价值”_Ios_Objective C - Fatal编程技术网

Ios 目标C-区分无价值和“无价值”

Ios 目标C-区分无价值和“无价值”,ios,objective-c,Ios,Objective C,我正在构建一个图表视图,并给它一个数据源,它可以向它请求一个对应于给定X索引的Y值。在某些情况下,给定的X索引没有Y值。在这种情况下,我不能发送nil,因为0可能是一个完全有效的Y值。在目标C中,传达根本没有价值的最佳方式是什么?nil不是0。他们是不同的 如果您使用的是NSNumber,那么nil显然与NSNumber集合不相交 如果您使用int,那么就不能使用nil。在我看来,您正在使用某种对象(可能是NSNumber)在模型和视图之间发送数据,该对象持有一个值,您正在通过发送消息来检索该值

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

nil不是0。他们是不同的

如果您使用的是NSNumber,那么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表示成功或失败。