NSMutableDictionary 返回 null
NSMutableDictionary returning null
我在 NSObject
class 中创建了一个 NSMutableDictionary
,例如
@property (nonatomic, strong) NSMutableDictionary<NSNumber *, NSString *> *requestComments;
并在经过API.
时将数据保存在这个变量中
但是当我发送密钥以获取值时,它每次都返回 null。
为了获得我这样做的价值
NSLog(@"%@",dataManager.requestComments[serviceRequest.RequestId]);
// serviceRequest.RequestId is returning NSNumber.
我得到的输出是 "(null)"
如果我以前喜欢这个,那么它 returns 一个值
NSLog(@"%@",[dataManager.requestComments valueForKey:@"30221"]);
为什么在上述情况下返回 null。
根据你的问题,这应该有效
NSLog(@"%@",dataManager.requestComments[[serviceRequest.RequestId stringValue]]);
因为您将密钥设置为 NSString
,而您期望它是基于 NSNumber
的 return。您需要查看用于存储此词典的代码。
更新
您提到密钥是 NSNumber
类型。但是您在 valueForKey
中传递了一个字符串并取回了一个有效的对象。你应该检查你是如何从 API 响应中形成这个字典的。
因为您将 requestComment
声明为 NSDictionary
,其中键是 NSNumbers
并且值是 NSString
并没有强制它遵守它。
样本:
_requestComments = [[NSMutableDictionary alloc] init];
[_requestComments setObject:[NSNumber numberWithInt:34] forKey:@"54"]; // => Warning: Incompatible pointer types sending 'NSNumber * _Nonnull' to parameter of type 'NSString * _Nonnull'
id obj = [NSNumber numberWithInt:35];
id key = @"55";
[_requestComments setObject:obj forKey:key];
NSLog(@"[_requestComments objectForKey:@\"55\"]: %@", [_requestComments objectForKey:@"55"]); //Warning: Incompatible pointer types sending 'NSString *' to parameter of type 'NSNumber * _Nonnull'
NSLog(@"[_requestComments objectForKey:@(55)]: %@", [_requestComments objectForKey:@(55)]);
日志:
$>[_requestComments objectForKey:@"55"]: 35
$>[_requestComments objectForKey:@(55)]: (null)
好吧,我用id
来引诱编译器,但是id
是一个common returned "class",in objectAtIndex:
,等等。在[=39中很常见=] 当您认为一个对象将是 NSString
但实际上是 (inverse) 的 NSNumber
时进行解析。
在执行 requestComments[serviceRequest.RequestId]
之前,枚举所有键值 & class 和所有对象值 & class。你可以这样检查:
for (id aKey in _requestComments)
{
id aValue = _requestComments[aKey];
NSLog(@"aKey %@ of class %@\naValue %@ of class %@", aKey, NSStringFromClass([aKey class]),aValue, NSStringFromClass([aValue class]));
}
然后您可以尝试跟踪您输入错误密钥的位置 (class)。
我在 NSObject
class 中创建了一个 NSMutableDictionary
,例如
@property (nonatomic, strong) NSMutableDictionary<NSNumber *, NSString *> *requestComments;
并在经过API.
时将数据保存在这个变量中但是当我发送密钥以获取值时,它每次都返回 null。
为了获得我这样做的价值
NSLog(@"%@",dataManager.requestComments[serviceRequest.RequestId]);
// serviceRequest.RequestId is returning NSNumber.
我得到的输出是 "(null)"
如果我以前喜欢这个,那么它 returns 一个值
NSLog(@"%@",[dataManager.requestComments valueForKey:@"30221"]);
为什么在上述情况下返回 null。
根据你的问题,这应该有效
NSLog(@"%@",dataManager.requestComments[[serviceRequest.RequestId stringValue]]);
因为您将密钥设置为 NSString
,而您期望它是基于 NSNumber
的 return。您需要查看用于存储此词典的代码。
更新
您提到密钥是 NSNumber
类型。但是您在 valueForKey
中传递了一个字符串并取回了一个有效的对象。你应该检查你是如何从 API 响应中形成这个字典的。
因为您将 requestComment
声明为 NSDictionary
,其中键是 NSNumbers
并且值是 NSString
并没有强制它遵守它。
样本:
_requestComments = [[NSMutableDictionary alloc] init];
[_requestComments setObject:[NSNumber numberWithInt:34] forKey:@"54"]; // => Warning: Incompatible pointer types sending 'NSNumber * _Nonnull' to parameter of type 'NSString * _Nonnull'
id obj = [NSNumber numberWithInt:35];
id key = @"55";
[_requestComments setObject:obj forKey:key];
NSLog(@"[_requestComments objectForKey:@\"55\"]: %@", [_requestComments objectForKey:@"55"]); //Warning: Incompatible pointer types sending 'NSString *' to parameter of type 'NSNumber * _Nonnull'
NSLog(@"[_requestComments objectForKey:@(55)]: %@", [_requestComments objectForKey:@(55)]);
日志:
$>[_requestComments objectForKey:@"55"]: 35
$>[_requestComments objectForKey:@(55)]: (null)
好吧,我用id
来引诱编译器,但是id
是一个common returned "class",in objectAtIndex:
,等等。在[=39中很常见=] 当您认为一个对象将是 NSString
但实际上是 (inverse) 的 NSNumber
时进行解析。
在执行 requestComments[serviceRequest.RequestId]
之前,枚举所有键值 & class 和所有对象值 & class。你可以这样检查:
for (id aKey in _requestComments)
{
id aValue = _requestComments[aKey];
NSLog(@"aKey %@ of class %@\naValue %@ of class %@", aKey, NSStringFromClass([aKey class]),aValue, NSStringFromClass([aValue class]));
}
然后您可以尝试跟踪您输入错误密钥的位置 (class)。