1

我有一个几乎相同的代码,唯一改变的是代码“工作”的属性,例如

-(void) removeItemsBelowPrice:(NSInteger)p_minimumPrice andAbove:(NSInteger)p_maximumPrice
{
    for( int itemIdx = self.itemsList.count-1; itemIdx >= 0 ; itemIdx--)
    {
        if(((BasicItem*)self.itemsList[itemIdx]).price < p_minimumPrice ||
           ((BasicItem*)self.itemsList[itemIdx]).price > p_maximumPrice)
        {
            [self.itemsList removeObjectAtIndex:itemIdx];
        }
    }
}

所以对于属性amountInStorage,我会复制相同的函数并将属性从价格更改为amountInStorage,我想知道是否有一种方法可以编写一个可以接收该属性的通用函数来处理,如果可能的话这个属性可以属于不同类型

谢谢。

4

2 回答 2

4

是的,你可以用 NSPredicate 做到这一点:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(YOUR_PROPERTY > LOWER_LIMIT) AND (YOUR_PROPERTY < UPPER_LIMIT)"];
[yourArray filteredArrayUsingPredicate:predicate]

让我们看一些未经测试的示例代码:

-(NSArray*)filterArray:(NSArray*)array byProperty:(NSString*)property lowerLimit:(double)lowerLimit upperLimit:(double)upperLimit{
    return [array filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:[NSString stringWithFormat:@"(%@ >= %g) AND (%@ <= %g)",property,lowerLimit,property,upperLimit]]];
}
于 2013-10-03T10:49:32.057 回答
2

您在枚举集合类时正在修改它,这是您无法做到的(这个问题发生在许多语言中,而不仅仅是 Objective-C)。

改用这种技术,它首先找到所有要删除的对象,然后将它们删除:

NSIndexSet *indexes = [self.itemList indexesOfObjectsPassingTest:^(id obj, NSUInteger idx, BOOL *stop) {
    BasicItem *basicItem = (BasicItem *)obj;
    return basicItem.price < p_minimumPrice || basicItem.price > p_maximumPrice;
}];
[self.itemList removeObjectsAtIndexes:indexes];
于 2013-10-03T10:49:58.830 回答