Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone NSPredicate子查询语法_Iphone_Ios_Nsarray_Nspredicate - Fatal编程技术网

Iphone NSPredicate子查询语法

Iphone NSPredicate子查询语法,iphone,ios,nsarray,nspredicate,Iphone,Ios,Nsarray,Nspredicate,我有一些不友好的字典数组,这些字典又有数据数组,我试图根据传递谓词的任何内部数组过滤外部数组。我似乎无法创建一个NSPredicate来实现这一点。我从以下几点开始: NSPredicate *lookupPredicate = [NSPredicate predicateWithFormat: @"row_values.property_id == %@ AND row_values.property_value == %@", @"47

我有一些不友好的字典数组,这些字典又有数据数组,我试图根据传递谓词的任何内部数组过滤外部数组。我似乎无法创建一个NSPredicate来实现这一点。我从以下几点开始:

NSPredicate *lookupPredicate = [NSPredicate predicateWithFormat:
             @"row_values.property_id == %@ AND row_values.property_value == %@",
               @"47cc67093475061e01000540", @"Male"];

[dataRows filterUsingPredicate:lookupPredicate];
这不返回任何值。我尝试了各种形式的ANY,但似乎找不到任何可以解析的东西。同样,目标是只保留那些内部数组字典内容的谓词为真的外部数组字典。我可以看到我花了一天的时间来琢磨咒语来实现这个目标。。。有什么想法吗

dataRows:
(
 {
    row = 1;
    "row_values" =     (
            {
              "property_id" = 47cc67093475061e01000542;
              "property_value" = "Mr.";
            },
            {
               "property_id" = 47cc67093475061e01000540;
               "property_value" = Male;
            }
     );
 },
 {
    row = 2;
    "row_values" =     (
           {
             "property_id" = 47cc67093475061e01000542;
             "property_value" = "Ms.";
           },
 ...
   }
}
老兄,“不友好”是对那个阵型的轻描淡写

好吧,我想我明白了:

NSArray *dataRows = @[
                      @{ @"row" : @"1",
                         @"row_values" : @[
                                           @{ @"property_id" : @"47cc67093475061e01000542", 
                                              @"property_value" : @"Mr." },
                                           @{ @"property_id" : @"47cc67093475061e01000540", 
                                              @"property_value" : @"Male" }
                                          ]
                       },
                      @{ @"row" : @"2",
                         @"row_values" : @[
                                           @{ @"property_id" : @"47cc67093475061e01000542", 
                                              @"property_value" : @"Ms." },
                                           @{ @"property_id" : @"47cc67093475061e01000540", 
                                              @"property_value" : @"Female" }
                                          ]
                       }
                     ];

NSPredicate *p = [NSPredicate predicateWithFormat:@"SUBQUERY(row_values, $rv, $rv.property_id = %@ AND $rv.property_value = %@).@count > 0", @"47cc67093475061e01000540", @"Male"];

NSArray *filtered = [dataRows filteredArrayUsingPredicate:p];
让我们看看这个谓词在做什么

  • 从最外层开始:

    SUBQUERY([stuff]).@count > 0
    
    子查询
    返回一个对象数组。我们将在
    dataRows
    数组中的每个
    NSDictionary
    上运行此
    子查询
    ,我们希望聚合该字典上的
    子查询
    返回内容的所有字典。因此,我们运行
    子查询
    ,然后(因为它返回一个集合),询问其中有多少项(
    @count
    ),看看是否大于0。如果是,则顶级字典将位于最终过滤数组中

  • 深入到
    子查询

    SUBQUERY(row_values, $rv, $rv.property_id = %@ AND $rv.property_value = %@)
    
    每个
    子查询都有三个参数:键路径、变量和谓词。关键路径是我们要迭代的对象的属性。由于子查询
    是在最外层的字典上计算的,因此我们将请求该字典的
    @“row\u values”
    ,并返回一个数组。然后,
    子查询
    将迭代
    行\u值
    集合中的项

    这个变量就是我们将要调用集合中的每个项。在这种情况下,它将是
    $rv
    (row value的缩写)。在我们的例子中,每个
    $rv
    都将是一个
    NSDictionary
    ,因为
    行的值是一个字典数组

    最后,将执行谓词,依次为每个字典替换
    $rv
    。在本例中,我们希望查看字典是否具有特定的
    属性\u id
    和特定的
    属性\u值。如果这样做,它将聚合到一个新数组中,,这就是从
    子查询返回的数组

    因此,换一种方式来说,
    子查询
    将构建一个包含所有行值的数组,这些行值具有我们要查找的内容的
    属性id
    属性值

  • 最后,当我运行此代码时,我得到:

    (
            {
            row = 1;
            "row_values" =         (
                            {
                    "property_id" = 47cc67093475061e01000542;
                    "property_value" = "Mr.";
                },
                            {
                    "property_id" = 47cc67093475061e01000540;
                    "property_value" = Male;
                }
            );
        }
    )
    

    苹果的子查询文档分散在几个地方

    • 描述子查询的文档/语法的一个地方是:
    子查询表达式的字符串格式为:

    子查询(集合表达式、变量表达式、谓词)

    其中表达式是一个计算结果为集合的谓词表达式,variableExpression是一个用于包含集合中每个单独元素的表达式,predicate是用于确定元素是否属于结果集合的谓词


    有关更多详细信息和示例,请参见。

    实际上,我只是简化了源代码结构,以便使用更简单的谓词。开玩笑。。。非常感谢你,戴夫!!这是完美的工作,它是有道理的。我非常感谢您的帮助,如果您需要关于黑色的RGB值或英语中有多少元音的帮助,请告诉我-这些我可以处理。可能是重复的