【问题标题】:getting the value through key in the dictionary通过字典中的键获取值
【发布时间】:2011-05-25 09:33:15
【问题描述】:

我需要获取地图中特定键的值,

id val = [m_cAppIdMap valueForKey:wTimerIds];

其中wTimerIds 是一个无符号短整数。

运行时异常:EXC_BAD_ACCESS

警告:传递参数 1 'valueForKey:' 使指针来自 没有强制转换的整数

已编辑:

 NSNumber* val = [m_cAppIdMap valueForKey:[NSNumber numberWithUnsignedShort:wTimerIds]];

我得到的警告是, 不兼容的 Objective-C 类型 'struct NSNumber *',预期 'struct NSString *' 时 从不同的 Objective-C 类型传递 'valueForKey:' 的参数 1

我得到的运行时异常是, [NSCFNumber 长度]:无法识别的选择器发送到实例 0x100110c20

我将密钥作为 unsignedshort 存储在字典中。所以我试图在字典中搜索具有该数据类型的值。

【问题讨论】:

  • 试试这个 id* val = [m_cAppIdMap valueForKey:wTimerIds];
  • 或者这个 id* val = (id*)[m_cAppIdMap valueForKey:wTimerIds];
  • @viTo Brothers:我试过你让我做的。但它仍然有错误,伙计。

标签: objective-c


【解决方案1】:

您不能将原始整数作为键。键必须是对象。您可以将该整数包装到 NSString 以用作键。

NSString *key = [NSString stringWithFormat:@"%d", wTimerIds];
[m_cAppIdMap setValue:val forKey:key];
id val = [m_cAppIdMap valueForKey:key];

或者您也可以将其包装在 NSNumber 中。您需要对设置和获取使用相同的东西。也就是说,如果您在setValue:forKey: 中使用字符串,那么您需要为valueForKey: 使用字符串。同样,如果您使用NSNumber,那么您需要在两个地方都使用它。

【讨论】:

  • 当有一个非常好的数字对象类型时为什么要转换为字符串?
  • 只是很多人,包括我 :-),只喜欢字符串作为键。虽然数字非常好。我已经编辑了我的答案。
  • 我正在检索的值是一个指向结构的指针。它向我显示一个空值。但实际上键的值存在于字典中。
  • 你是如何在字典中添加值的?
【解决方案2】:

你应该使用

NSNumber *wTimerIdsNum = [NSNumber numberWithInt:wTimerIds];
id val = [m_cAppIdMap objectForKey:wTimerIdsNum];

【讨论】:

  • 我仍然将无法识别的选择器发送到实例 0x100110c20 和 /NSArray/NSArray1.m:107:0 /NSArray/NSArray1.m:107:警告:不兼容的 Objective-C 类型 'struct NSNumber * ',当从不同的 Objective-C 类型警告中传递 'valueForKey:' 的参数 1 时,预期为 'struct NSString *'
  • @ron m_cAppIdMap 变量是什么类型?尝试 objectForKey: 而不是 valueForKey.
  • 谢谢老兄,它起作用了。存储的值是指向对象结构的指针。
  • 用 objectForKey 编辑你的答案,以便我可以接受你的答案。
猜你喜欢
  • 2018-04-13
  • 2020-08-06
  • 2012-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-11
  • 1970-01-01
相关资源
最近更新 更多