【问题标题】:Accessing NSDictionary retrieves an object instead of NSString访问 NSDictionary 检索对象而不是 NSString
【发布时间】:2013-07-10 06:49:23
【问题描述】:

我有一个用 JSON 填充的 NSDictionary。这一切看起来都很棒,而且它部分为我工作。我正在设置我的类的 NSString 类型的属性,该属性等于某个键的值,奇怪的是,这将我的属性设置为等于一个对象,该对象是我需要的字符串值。

字典(印刷说明):

miscInfo:
<__NSArrayI 0x7494ab0>(
{
  Abbreviation = DR;
  DateInactive = "";
  Description = Drowsiness;
  ForQueue = 2430;
  IsAdditive = 0;
  IsReserved = 1;
  MiscCodeTypeStr = AVR;
  PluralDescription = "";
  ReservedDescription = Drowsiness;
}

我将它设置在我的财产上,如下所示:

self.ReactionName = [miscInfo valueForKeyPath:@"Description"];

产生:

我尝试将其转换为 NSString,例如:

self.ReactionName = (NSString*)[allergenAdverseReaction valueForKeyPath:@"Description"];

但什么都没有。我做错了什么?

【问题讨论】:

  • 您是否看到了一些错误,或者您只是对在调试器中看到的内容感到困惑?
  • 不,完全没有错误。我也设置了类似的属性,但不是我说“@'1 object'”的地方,其他人说我所追求的名字,在这种情况下是“嗜睡”
  • 你能不能运行NSLog(@"%@", NSStringFromClass([[miscInfo valueForKeyPath:@"Description"] class])); 看看它说了什么。
  • 当 objectForKey 也能正常工作时使用 valueForKeyPath 是不明智的。它更容易混淆而不是简化。

标签: ios objective-c json


【解决方案1】:

miscInfo 是一个包含字典的数组,所以

self.ReactionName = [[miscInfo objectAtIndex:0] objectForKey:@"Description"];

会给出你期望的结果。或者,使用现代数组和字典 下标语法:

self.ReactionName = miscInfo[0][@"Description"];

备注:在你的代码中

self.ReactionName = [miscInfo valueForKeyPath:@"Description"];

valueForKeyPath 应用于数组的每个元素,并且一个 array 包含所有 返回值。这就是您在 Xcode 调试器窗口中看到的内容。

这个“功能”可能非常有用,但总的来说(如上面的 Hot Licks 评论) objectForKey 是从字典中获取值的正确方法。和

self.ReactionName = [miscInfo objectForKey:@"Description"];

如果 miscInfo 不是预期的字典,则抛出描述性运行时异常。

【讨论】:

    【解决方案2】:

    在我看来,miscInfo 是一个字典数组。在这种情况下 valueForKey 将返回一个数组。看看下面的代码是否有效。如果是这样,那么它就是一个字典数组。

    self.ReactionName = [[allergenAdverseReaction valueForKeyPath:@"Description"]lastObject];
    

    【讨论】:

    • 做到了。伙计,我需要你的工资单。这周你救了我两次高五
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多