Как я могу сделать поиск подобъекта более лаконичным? - PullRequest
1 голос
/ 24 июня 2011

Мне интересен краткий способ поиска соответствия в массиве, который требует уровней подобъектов. Производительность не должна быть близкой к идеальной, но должна быть разумной.

Для этого случая Я не хочу добавлять обратную связь или управлять сохраненными словарями . Я вообще не хочу менять модель.

Object1 содержит Object2, а Object2 содержит Object3. Я понимаю, что следующий метод вернет совпадение first , однако будет также приемлемо решение, которое возвращает каждое совпадение.

-(Object1*)getObject1ForObject3:(Object3*)object3
{
    for(Object1 *object1 in self.object1s)
        if(object1.object2.object3 == object3)
            return  object1 ;

    return nil ;
}

А для престижа, можем ли мы сделать это кратким, если в середине есть отношения ко многим?

-(Object1*)getObject1ForObject3:(Object3*)object3
{
    for(Object1 *object1 in self.object1s)
        for(Object2 *object2 in object1.object2s)
            if(object2.object3 == object3)
                return  object1 ;

    return nil ;
}

1 Ответ

3 голосов
/ 24 июня 2011

Ну, API для объявления NSPredicate не совсем кратко , но все же, вероятно, более кратко, чем вы делаете.

Для первого случая, когда посередине нет слишком многих:

NSPredicate *pred = [NSPredicate predicateWithFormat:@"object2.object3 == %@", object3];
NSArray *matchingObj1s = [self.object1s filteredArrayUsingPredicate];

Когда в середине есть отношение ко-многим:

NSPredicate *pred = [NSPredicate predicateWithFormat:@"ANY object2s.object3 == %@", object3];
NSArray *matchingObj1s = [self.object1s filteredArrayUsingPredicate];
...