NSMutableDictionary和[NSNull null]值

时间:2013-01-24 00:03:22

标签: objective-c cocoa-touch nsdictionary nsnull

确定。我搜查并搜索无济于事,我一直在争吵。

我试图确定UITextField是否有空值,如果是,则将空值发送到服务器,而不仅仅是空字符串。

以下代码

NSDictionary *locationDict = @{
    @"country":countryVal,
    @"state":stateVal,
    @"city":[cityField.text isEqualToString:@""] ? [NSNull null] : cityField.text
};
NSLog(@"%@", locationDict);

记录此

{
    city = "<null>";
    country = US;
    state = TN;
}

我无法弄清楚为什么[NSNull null]会被"<null>"记录下来。如果用户没有输入值,应用程序会继续将该字符串作为城市发送,显然不是我想要的。我没有在此处显示网络电话,但我使用AFNetworking来执行此操作。不过,在我调用AFN之前,我可以确认字典包含该字符串而不是null。所以我知道问题并不在于AFN。

非常感谢任何帮助。

4 个答案:

答案 0 :(得分:7)

<null>[[NSNull null] description]的结果。您可以使用NSLog(@"%@", [NSNull null]);自行查看。如果您在用户未输入城市时需要<null>以外的其他内容,请使用您想要的值,而不是行[NSNull null]中的@"city":[cityField.text isEqualToString:@""] ? [NSNull null] : cityField.text

答案 1 :(得分:2)

当您记录Obj-C对象(使用%@)时,NSLog函数实际上会在其上调用-(NSString*)description并打印返回的任何字符串。此方法继承自NSObjectNSDictionary已覆盖该方法。它创建一个字符串,它是键/值对的列表,由=分隔并包装成花括号。因此,它会在任何键和该词典的任何值上调用description。如果您在description对象上调用NSNull,则会返回字符串<null>desription的{​​{1}}方法如下所示:

NSNull

引号由- (NSString *)description { return @"<null>"; } 添加,因为包含除ASCII字母和数字以外的字符(在本例中为NSDictionary<)的每个字符串都包含在引号中。如果您将>替换为US而将US.替换为TN,则这两个也会引用。

我不明白为什么你首先使用!TN。将空字符串放入字典没有问题,服务器可以简单地检查字符串是否为空。

NSNull

输出

NSDictionary *locationDict = @{
    @"country":@"US",
    @"state":@"TN",
    @"city":@""
};
NSLog(@"%@", locationDict);

答案 2 :(得分:0)

关于[[NSNull null]描述]的答案是正确的。

IMO如果要向服务器发送“null”值,请不要填充该键/值对。如果你想在这里做任何特别的事情,你将不得不预先处理字典。

这很大程度上取决于您是否可以控制服务器处理事物的方式以及您发送的格式。

通常会有代码将NSNull转换为nil并返回集合处理代码。

答案 3 :(得分:0)

如果你需要一个以不同的方式描述自己的null,你可以考虑子类化NSNull或者你可以子类化NSValue - 子类化NSValue为你提供了一些额外的好处,可以为你提供一些可以解码/编码成NSPropertyList的东西。