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 については、同じ関数を複製し、プロパティを price から 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 に答える