iOS如何检查valueForKey是否存在?

iOS如何检查valueForKey是否存在?,ios,objective-c,Ios,Objective C,我还有一个关于检查valueForKey是否存在的问题。 这是我的密码: id _jsonId = [NSJSONSerialization JSONObjectWithData:[_json dataUsingEncoding:NSUTF8StringEncoding] options:0 error:&_error]; Monday = [[NSMutableArray alloc] init]; if ([_jsonId valueForKey:@"Mon"]!= Nil) {

我还有一个关于检查valueForKey是否存在的问题。 这是我的密码:

id _jsonId = [NSJSONSerialization JSONObjectWithData:[_json dataUsingEncoding:NSUTF8StringEncoding] options:0 error:&_error];
Monday = [[NSMutableArray alloc] init];
if ([_jsonId valueForKey:@"Mon"]!= Nil) {
    _keyMon = [_jsonId valueForKey:@"Mon"];
    [Monday addObject:@"Monday"];
    for (int i=0; i<5; i++) {
        if ([_keyMon objectAtIndex:i]!=[NSNull null]) {

            [Monday addObject:[_keyMon objectAtIndex:i]];
        }
    }

} else {
    [_keyTues addObject:@"No Class For Today"];
    [Monday addObject:[_keyMon objectAtIndex:1]];
}
尽管如此,XCode告诉我我要在NSArray中添加一个nil

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSArrayM insertObject:atIndex:]: object cannot be nil'

这让我抓狂…

\u jsonId
定义如下:

id _jsonId = [NSJSONSerialization JSONObjectWithData:[_json dataUsingEncoding:NSUTF8StringEncoding] options:0 error:&_error];
。。。将是数组或字典。根据你的代码,我想你是在假设它总是一本字典。因此,您可能需要添加:

if (![_jsonId isKindOfClass:[NSDictionary class]]) ...
然后你想知道字典里有什么,如果有的话。因此,请使用
objectForKey:
。或者,更好的方法是只使用jsonId[@“Mon”]。您将获得一个对象或
nil


valueForKey:
是一种完全不同的机制,即键值编码。它是在
NSObject
上定义的,因此被
NSDictionary
以及几乎所有其他内容继承。它被定义为引发未知密钥的异常。由于它会引发异常而不是返回结果,因此比较结果的尝试无效。

\u jsonId
定义如下:

id _jsonId = [NSJSONSerialization JSONObjectWithData:[_json dataUsingEncoding:NSUTF8StringEncoding] options:0 error:&_error];
。。。将是数组或字典。根据你的代码,我想你是在假设它总是一本字典。因此,您可能需要添加:

if (![_jsonId isKindOfClass:[NSDictionary class]]) ...
然后你想知道字典里有什么,如果有的话。因此,请使用
objectForKey:
。或者,更好的方法是只使用jsonId[@“Mon”]。您将获得一个对象或
nil


valueForKey:
是一种完全不同的机制,即键值编码。它是在
NSObject
上定义的,因此被
NSDictionary
以及几乎所有其他内容继承。它被定义为引发未知密钥的异常。由于它会引发异常而不是返回结果,因此比较结果的尝试无效。

\u jsonId
定义如下:

id _jsonId = [NSJSONSerialization JSONObjectWithData:[_json dataUsingEncoding:NSUTF8StringEncoding] options:0 error:&_error];
。。。将是数组或字典。根据你的代码,我想你是在假设它总是一本字典。因此,您可能需要添加:

if (![_jsonId isKindOfClass:[NSDictionary class]]) ...
然后你想知道字典里有什么,如果有的话。因此,请使用
objectForKey:
。或者,更好的方法是只使用jsonId[@“Mon”]。您将获得一个对象或
nil


valueForKey:
是一种完全不同的机制,即键值编码。它是在
NSObject
上定义的,因此被
NSDictionary
以及几乎所有其他内容继承。它被定义为引发未知密钥的异常。由于它会引发异常而不是返回结果,因此比较结果的尝试无效。

\u jsonId
定义如下:

id _jsonId = [NSJSONSerialization JSONObjectWithData:[_json dataUsingEncoding:NSUTF8StringEncoding] options:0 error:&_error];
。。。将是数组或字典。根据你的代码,我想你是在假设它总是一本字典。因此,您可能需要添加:

if (![_jsonId isKindOfClass:[NSDictionary class]]) ...
然后你想知道字典里有什么,如果有的话。因此,请使用
objectForKey:
。或者,更好的方法是只使用jsonId[@“Mon”]。您将获得一个对象或
nil


valueForKey:
是一种完全不同的机制,即键值编码。它是在
NSObject
上定义的,因此被
NSDictionary
以及几乎所有其他内容继承。它被定义为引发未知密钥的异常。因为它会引发异常而不是返回结果,所以您尝试比较结果是无效的。

我想我已经找到了答案。让我们看看代码:

if (_jsonId[@"Sun"]== nil) {
    [_keySun addObject:@"No Class For Today"];
    [Monday addObject:[_keySun objectAtIndex:1]];
}
else {
   _keySun = [_jsonId objectForKey:@"Sun"];
    ...
如果存在键“Sun”的对象,则将其存储到_keySun中。如果没有对象,则在_keySun中不存储任何内容_凯森将为零。您向_keySun发送addObject消息,但发送给nil对象的任何消息都不起作用。然后调用[\u keySun objectAtIndex:1]。同样,向nil对象发送消息不起任何作用,并返回nil,这就是为什么将nil添加到Monday对象并导致崩溃的原因

如果将_keySun设置为空NSMutableArray,则会由于另一个原因崩溃:您试图添加一个对象。您可以使用objectAtIndex读取一个对象:0。但是要读取objectAtIndex:1,数组中需要两个对象


顺便说一句,如果您正在阅读的JSON文档包含显式null,那么您将从JSON解析器获得[NSNull null]。因此,如果JSON包含“Sun”:null,那么objectForKey:@“Sun”将给出[NSNull null]。如果JSON根本不包含键“Sun”,objectForKey:@“Sun”将给出nil

我想我知道了。让我们看看代码:

if (_jsonId[@"Sun"]== nil) {
    [_keySun addObject:@"No Class For Today"];
    [Monday addObject:[_keySun objectAtIndex:1]];
}
else {
   _keySun = [_jsonId objectForKey:@"Sun"];
    ...
如果存在键“Sun”的对象,则将其存储到_keySun中。如果没有对象,则在_keySun中不存储任何内容_凯森将为零。您向_keySun发送addObject消息,但发送给nil对象的任何消息都不起作用。然后调用[\u keySun objectAtIndex:1]。同样,向nil对象发送消息不起任何作用,并返回nil,这就是为什么将nil添加到Monday对象并导致崩溃的原因

如果将_keySun设置为空NSMutableArray,则会由于另一个原因崩溃:您试图添加一个对象。您可以使用objectAtIndex读取一个对象:0。但是要读取objectAtIndex:1,数组中需要两个对象


顺便说一句,如果您正在阅读的JSON文档包含显式null,那么您将从JSON解析器获得[NSNull null]。因此,如果JSON包含“Sun”:null,那么objectForKey:@“Sun”将给出[NSNull null]。如果JSON根本不包含键“Sun”,objectForKey:@“Sun”将给出nil

我想我知道了。让我们看看代码:

if (_jsonId[@"Sun"]== nil) {
    [_keySun addObject:@"No Class For Today"];
    [Monday addObject:[_keySun objectAtIndex:1]];
}
else {
   _keySun = [_jsonId objectForKey:@"Sun"];
    ...
如果存在键“Sun”的对象,则将其存储到_keySun中。如果没有对象,则在_keySun中不存储任何内容_凯森将为零。您向_keySun发送addObject消息,但发送给nil对象的任何消息都不起作用。然后调用[\u keySun objectAtIndex:1]。同样,向nil对象发送消息不起任何作用,并返回nil,这就是为什么将nil添加到Monday对象并导致崩溃的原因

如果将_keySun设置为空NSMutableArray,则会由于另一个原因崩溃:您试图添加一个