通过词典的阵列搜索(Searching through an array of dictionari

2019-07-30 17:14发布

我在做这显示有关红葡萄酒信息的iPhone应用程序。 葡萄酒被存储在字典中含有的阵列的plist中。 我添加一个搜索视图控制器的应用,并启动容易我想要得到谁的“姓名”的值项包含 nameString(从文本框)的葡萄酒。

它种在这里停止,我需要了解这样做的最合适的方式提出了一些建议。 是否有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*/;

Answer 1:

如何只需通过遍历数组和比较的名字呢?

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];
}

斯威夫特版本就更简单了:

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

干杯,安卡



Answer 2:

这个作品! 测试!

for (NSDictionary* dict in Array) {

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

        Index = [Array indexOfObject:dict];
    }
}


Answer 3:

我们可以使用NSPredicate过,就像这样:

NSPredicate *predicate =
  [NSPredicate predicateWithFormat:@"publisher == %@", @"Apress" ];
NSArray *filtered  = [bookshelf filteredArrayUsingPredicate:predicate];

如果发布者可以在书架阵列中找到,过滤计数将是大于0。

我认为这种方式寻找更清洁的方式。 希望能帮助到你。



Answer 4:

记得分手的要求; 你的for循环,一旦你的对象已被发现



文章来源: Searching through an array of dictionaries