【问题标题】:Using NSPredicate to find an object with a key starting with an @使用 NSPredicate 查找具有以 @ 开头的键的对象
【发布时间】:2014-05-08 00:31:48
【问题描述】:

我将这个 JSON 对象加载到 NSDictionary 中:

media =     {
       photos =         {
           photo =             (
                               {
                   "$t" = "http://some url";
                   "@id" = 1;
                   "@size" = x;
               },
                               {
                   "$t" = "http://another url";
                   "@id" = 1;
                   "@size" = fpm;
               },
                               {
              );
       };
};

我正在尝试搜索照片数组并仅返回 @size 属性 = x 的照片。

我认为这可行,但它返回零个对象:

 NSObject *photo = [[photos valueForKeyPath:@"media.photos.photo"] filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"%@ == x",@"@size"]];

我尝试在“x”周围加上单引号,但也失败了。我认为这是导致问题的属性名称本身的@符号。任何帮助将不胜感激。

编辑

以@ 开头的键似乎是问题所在。如果我尝试使用 NSPredicate 搜索数组,则会引发“NSUnknownKeyException ...类不符合键值”错误。

我可以像这样使用嵌套的 for 循环进行搜索:

for (id photo in photos)
 {
     for (id key in photo) 
     {
         id value = [photo objectForKey:key];

         if ([key isEqualToString:@"@size"] && [value isEqualToString:@"x"])
         {
           stringXLargePhotoUrl = [photo valueForKey:@"$t"];
           break;
          }
      }
      if (stringXLargePhotoUrl != Nil)
         break;
   }

但这很笨拙。如果可能的话,我宁愿使用 NSPredicate 。我不控制 JSON 对象,所以我不能只将键更改为不以 @ 开头。

【问题讨论】:

    标签: objective-c nspredicate


    【解决方案1】:

    这篇文章很好,可能对你有帮助http://nshipster.com/nspredicate/

    %@ 是一个对象值的 var arg 替换——通常是一个字符串, 编号或日期。

    %K 是键路径的 var arg 替换。

    改变

     ... [NSPredicate predicateWithFormat:@"%@ == x",@"@size"]];
    

    到

     ... [NSPredicate predicateWithFormat:@"%K == x",@"@size"]];
    

    (@ 到 K)。

    【讨论】:

    • 谢谢,但我仍有问题。它是属性中的@ 符号。它被视为“收藏运营商”。当我使用带有错误“NSUnknownKeyException ...类不符合键值”的代码建议时,我的应用程序崩溃。我认为这意味着我不允许在我的财产中使用 @ 符号。不幸的是,我无法控制 JSON 对象,也找不到转义 @ 符号的方法。任何建议将不胜感激。
    • @Dave:您是否尝试过使用反斜杠作为转义字符,例如"\@size"?
    • "\@size" 引发“未知转义序列”警告。运行带有警告的代码不会返回任何内容。不过还是谢谢。
    • 如果没有其他方法,您可以在将其序列化到 NSDictionary 之前从 json 字符串中删除 @ 符号。
    猜你喜欢
    • 1970-01-01
    • 2013-11-23
    • 1970-01-01
    • 2011-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-30
    相关资源
    最近更新 更多