Iphone 在一系列字典中搜索

Iphone 在一系列字典中搜索,iphone,objective-c,xcode,search,nsmutablearray,Iphone,Objective C,Xcode,Search,Nsmutablearray,我正在制作一个iPhone应用程序,它显示有关红酒的信息。葡萄酒储存在一个包含一系列词典的plist中。我正在向应用程序添加一个搜索视图控制器,为了便于启动,我希望获得“Name”键的值包含nameString(来自textbox)的值 这就到此为止了,我需要一些关于最合适的方法的建议。NSArray类中是否有一个函数将执行此任务,应该引入NSPredicate、NSUserDefaults,或者是否有其他选项?我已经做了一些研究,但我需要一些建议,也许还需要一个开始的例子 我将推进搜索功能,让

我正在制作一个iPhone应用程序,它显示有关红酒的信息。葡萄酒储存在一个包含一系列词典的plist中。我正在向应用程序添加一个搜索视图控制器,为了便于启动,我希望获得“Name”键的值包含nameString(来自textbox)的值

这就到此为止了,我需要一些关于最合适的方法的建议。NSArray类中是否有一个函数将执行此任务,应该引入NSPredicate、NSUserDefaults,或者是否有其他选项?我已经做了一些研究,但我需要一些建议,也许还需要一个开始的例子

我将推进搜索功能,让用户包括/排除国家,获得适合这种和那种食物的葡萄酒,设置最低价格、最高价格,等等。字典中有所有这些信息的字符串。因此,在我开始像这样的高级工作之前,我需要一些建议,哪些函数可以最好地完成我的工作

-(IBAction)searchButtonPoke:(id)sender{

    NSString *path = [[NSBundle mainBundle] pathForResource:@"Wines" ofType:@"plist"];
    allObjectsArray = [[NSMutableArray alloc] initWithContentsOfFile:path];

    NSString *nameString = [NSString stringWithFormat:@"%@", [nameTextField text]];

    resultObjectsArray = /*objects where the value for the key "Name" contains
                                                                   nameString*/;

简单地遍历数组并比较名称如何

resultObjectsArray = [NSMutableArray array];
for(NSDictionary *wine in allObjectsArray)
{
   NSString *wineName = [wine objectForKey:@"Name"];
   NSRange range = [wineName rangeOfString:nameString options:NSCaseInsensitiveSearch];
   if(range.location != NSNotFound)
     [resultObjectsArray addObject:wine];
}
Swift版本更简单:

let resultObjectsArray = allObjectsArray.filter{
    ($0["Name"] as! String).range(of: nameString,
                                  options: .caseInsensitive,
                                  range: nil,
                                  locale: nil) != nil
}
干杯,
安卡

这很有效!!!测试

for (NSDictionary* dict in Array) {

    if ([[dict objectForKey:@"key"] isEqualToString:string]) {

        Index = [Array indexOfObject:dict];
    }
}

我们也可以使用NSPredicate,如下所示:

NSPredicate *predicate =
  [NSPredicate predicateWithFormat:@"publisher == %@", @"Apress" ];
NSArray *filtered  = [bookshelf filteredArrayUsingPredicate:predicate];
如果可以在bookshelf数组中找到发布者,则筛选计数将大于0


我认为这是一种更干净的搜索方式。希望有帮助。

记得打破;找到对象后,退出for循环