确定 NSUInteger 是不是有值或为零

Posted

技术标签:

【中文标题】确定 NSUInteger 是不是有值或为零【英文标题】:Determine if NSUInteger has a value or is nil确定 NSUInteger 是否有值或为零 【发布时间】:2015-04-13 12:42:18 【问题描述】:

我正在尝试在 ios 上使用 HKAnchoredObjectQuery

为此,我必须为查询提供一个锚点,在本例中为NSUInteger。我想将此整数保存在NSUserDefaults 中以供将来查询,并且只想使用

if(anchor != nil) // do stuff

但是编译器告诉我,我不允许这样做,因为我正在将整数与指针进行比较,并且我理解为什么我不能这样做,但我不知道该怎么做。

错误代码是这样的

Comparison between pointer and integer ('NSUInteger' (aka 'unsigned long') and 'void *')

有谁知道我如何确定我的锚点是否有价值?

【问题讨论】:

使用这个作为锚是 NSUInteger ,所以 if(anchor != 0) //do stuff 使用 NSNumber 来保存可以与 nil 进行比较的整数。如果对象不在 UserDefaults 中,则未设置。否则它的值在 NSNumber 内。 【参考方案1】:

NSUInteger 是原始类型,而不是对象类型。 NSNumber 是一个对象类型。对于 NSNumber 对象,您可以检查它是否为 nil。 NSUInteger 永远不会为零,因为它是整数,而不是指针。

如果搜索失败,许多返回 NSUInteger 作为搜索结果的函数会返回常量 NSNotFound。 NSNotFound 被定义为一个非常大的整数(32 位为 2^31 - 1,64 位为 2^63 - 1)。

【讨论】:

专业提示:NSNotFound 是否定的,所以你必须使你的陈述为真,否则它会跳过你的if 陈述。【参考方案2】:

NSUInteger 不是对象,不能与 nil 进行比较。用过于简单的术语来说,对象是指向可能包含值或为nil 的内存位置的指针。 NSUInteger 只是一个值。它可能是0,或其他一些您不期望的值,但它会有一个值。

【讨论】:

【参考方案3】:

NSUInteger 不能为 nil,因为它不是对象。创建时的默认值为零。要保存在NSUserDefaults 中,您可以将其存储为NSNumber,稍后可以检查它是否为零。

将其存储在NSUserDefaults:

NSNumber *aNumber = @(anchor);
[[NSUserDefaults standardUserDefaults] setObject:aNumber forKey:aKey];

NSUserDefaults取回锚点:

NSNumber *aNumber = [[NSUserDefaults standardUserDefaults] objectForKey:aKey];
if (aNumber != nil) 
    NSUInteger anchor = [aNumber integerValue];

【讨论】:

【参考方案4】:

NSUInteger 或简单的 int 基本上是原始数据类型,它们应该与相应数据类型范围内的整数值进行比较。 nil 与引用的对象一起使用。

在您的情况下,由于锚点是 NSUInteger,因此您应该使用整数值来代替 nil as-

if(anchor != 0) 
// do stuff

【讨论】:

以上是关于确定 NSUInteger 是不是有值或为零的主要内容,如果未能解决你的问题,请参考以下文章

Django - urls 中的视图或条件选择两种 url 模式中的一种,以判断参数是不是具有值或为 NONE

查找字段存在的所有文档:在 Elasticsearch 中它有一个值或为空

根据可以具有值或为空的字段选择组内的行

Roblox 数据存储错误参数 2 丢失或为零

QMessageLogContext 的字段(如:文件、函数、行)为空或为零

确定文件是不是存在或为 0 字节