NSMutableDictionary 键没有指向任何内容

NSMutableDictionary keys pointing to nothing

我有一个 NSMutableDictionary 个 NSArray。我实际上想指向一些键。现在我正在使用 NSArray *someArray=[[NSArray alloc] init]; 来代表什么,即一个空数组。有更好的方法吗?

您可以使用 NSNull 的单例实例,它是为这种情况设计的:

dict[@"key"] = [NSNull null];

(它只是框架提供的一个占位符对象,用于不接受 nil 值的集合。当然不要与实际的 nil 混淆)

您可以将 @[] 用于空数组,您还可以在集合 class 中使用 [NSNull null] 表示空值,这完全取决于您要查找的语义。

我倾向于认为 @[] 更容易预测,因为您可以使用所有您期望的东西,迭代,-(NSUInteger)count 等。

要检查空值,您必须显式检查...dict["key"] == [NSNull null] 因为即使 [NSNull null] 也是布尔值 true,因为它是一个对象...

例如这不起作用:

for (NSString *s in [NSNull null])
{
    printf("you will never get here!");
}

这也不会:

id obj = [NSNull null];
[obj length];

printf("you wont get here");

所以这真的取决于你想如何构建你的流控制,因为如果你关心键是否存在,以及值,你处于 3 状态逻辑中......

使用 NSNULL

if(!dict[somekey])
{
    //key not set
}else if (dict[somekey] == [NSNull null])
{
    //key set, but null
}else
{
    // should expect a real value
}

使用空数组

if(!dict[somekey])
{
    //key not set
}else if (![dict[somekey] count])
{
    //key set, but empty array
}else
{
    // should expect a real value
}

您应该使用 NSNull 来表示 NSDictionary 中的任何内容。

话虽如此,在您拥有键的对象之前不分配键不是更容易吗?如果您分配 NSNull,您将需要测试与 NSNull 的相等性,因为测试 yourDictionary[@"nullKey"] 将始终 return YES,因为它确实有一个分配给它的对象。另一方面,如果你测试一个未分配的键,你会得到 nil,这可能就是你想要的。