2013-10-03 14 views
1

我有一个代码,几乎相同的是唯一改变的是代码“作品”上例如一个艰难的一个真正的Objective-C中的主人

-(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,我想知道是否有一种方法来编写一个通用的函数,可以接收属性来处理,如果可能的话,这个属性可以是不同的类型

谢谢。

+0

使用KVC,并在方法的参数发送键名。之后,做这样的事情([(BasicItem *)self.itemsList [itemIdx] valueForKey:key])

回答

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

似乎OP是使用一个可变数组,并直接工作,所以也许'filterUsingPredicate:'更接近到他目前正在尝试的东西。 – Monolo

+0

Tamas谢谢,我仍然在黑暗中如何编写该方法,请问您可以通过在方法中包装并展示mw如何调用它来扩展您的示例? –

+0

以示例更新我的答案。 –

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