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)。