Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/37.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 许多词典的汇编。找到具有给定键的必要值的NSDictionary的最佳方法是什么?_Iphone_Objective C_Ios_Xcode - Fatal编程技术网

Iphone 许多词典的汇编。找到具有给定键的必要值的NSDictionary的最佳方法是什么?

Iphone 许多词典的汇编。找到具有给定键的必要值的NSDictionary的最佳方法是什么?,iphone,objective-c,ios,xcode,Iphone,Objective C,Ios,Xcode,现在,我正在尝试下面的方法,并且效果很好 - (void)findDictionaryWithValueForKey:(NSString *)name { for (NSDictionary * set in myArray) { if ([[set objectForKey:@"title"] isEqualToString:name]) \\do something } }

现在,我正在尝试下面的方法,并且效果很好


    - (void)findDictionaryWithValueForKey:(NSString *)name {

         for (NSDictionary * set in myArray) {

            if ([[set objectForKey:@"title"] isEqualToString:name]) 
               \\do something

         }

    }
编辑: 我在雪莉的帖子中增加了一个额外的参数。现在它看起来更灵活了



- (NSDictionary *)findDictionaryWithValue:(NSString*)name forKey:(NSString *)key {

    __block BOOL found = NO;
    __block NSDictionary *dict = nil;

    [self.cardSetsArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        dict = (NSDictionary *)obj;
        NSString *title = [dict valueForKey:key];
        if ([title isEqualToString:name]) {
            found = YES;
            *stop = YES;
        }
    }];

    if (found) {
        return dict;
    } else {
        return nil;
    }

}

我也会这样建议,如果你用break语句会更好

- (void)findDictionaryWithValueForKey:(NSString)name {

     for (NSDictionary * set in myArray) {

        if ([[set objectForKey:@"title"] isEqualToString:name]) 
           \\do something
           break;
     }

}
根据NSArray文件

valueForKey:

Returns an array containing the results of invoking valueForKey: using key on each of the array's objects.
- (id)valueForKey:(NSString *)key
Parameters

key

    The key to retrieve.

Return Value

The value of the retrieved key.
Discussion

The returned array contains NSNull elements for each object that returns nil.
Availability

    * Available in Mac OS X v10.3 and later.
编辑:

试试这个

[myArray valueForKey:@"name"];

//这将返回一个值数组,但这实际上与所需的不同

使用数组的
filteredarrayingpredicate:
方法获取满足您要求的所有字典

NSPredicate * predicate = [NSPredicate predicateWithFormat:@" title MATCHES[cd] %@", name];
NSArray * matches = [myArray filteredArrayUsingPredicate:predicate];

现在,
matches
是一组字典,它们的
title
键等于
name

下面是一个使用较新API的可能实现。(我还修改了方法以实际返回值)。主要是为了演示API。假设标题对于数组中的一个词典是唯一的

    - (void)findDictionaryWithValueForKey:(NSString)name {

        for (NSDictionary * set in myArray) {


            NSString *s=[NSString stringWithFormat:@"%@",[set objectForKey:@"title"]];
            if ([s isEqualToString:name]) 
                \\do something

            }

            OR 
            if (s == name]) 
                \\do something

            }



    }
- (NSDictionary *)findDictionaryWithValueForKey:(NSString *)name {
  // ivar: NSArray *myArray;
  __block BOOL found = NO;
  __block NSDictionary *dict = nil;

  [myArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    dict = (NSDictionary *)obj;
    NSString *title = [dict valueForKey:@"title"];
    if ([title isEqualToString:name]) {
      found = YES;
      *stop = YES;
    }
  }];

  if (found) {
    return dict;
  } else {
    return nil;
  }

}

事实上,我的代码是有效的,但如果我需要深入研究,理解它就会变得疯狂。无论如何,谢谢你在我的代码中关于“break”的注释。一个较短的标题和正文中的问题会更好。没有“最佳方法”,有多种方法可以做到这一点。在可能有多个标题相同的情况下,这是一个很好的方法!这太好了,我使用了您的代码,并且在may类中稍微修改了一些,以便更灵活地管理这个根数组的内容。我把它作为对你答复的答复。