17

「ブランド」と呼ぶNSObjectクラスのオブジェクトがあり、次のプロパティがあります。

.name
.number
.site

ある時点で、これらのオブジェクトの数十がNSMutableArrayに格納されます。

object 1
object 2
object 3
object 4
...

配列から特定のオブジェクトをその番号で取得できるようにしたいと思います。配列上のオブジェクトのインデックスではなく、オブジェクトのnumberプロパティ(たとえば、numberプロパティが10に等しいオブジェクトを取得します)。

NSArrayには、ものを取得するためのスマートなメソッドがあることは知っていますが、これを使用することはめったにないので、深くはわかりません。配列上のすべてのオブジェクトを反復処理して各オブジェクトのnumberプロパティを確認せずに、配列からそのオブジェクトを取得する方法はありますか?

助けてもらえますか?ありがとう。

4

4 に答える 4

15

私はお勧めしNSPredicateます。listOfItems配列に上記のプロパティを持つが含まれていると仮定すると、このような方法でそれを行うことができNSObjectます。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"number == 10"];
NSArray *filtered = [listOfItems filteredArrayUsingPredicate:predicate];

フィルタリングされた結果、一致するすべての数値が配列に含ま10れるようになります。filteredオブジェクトにキャストバックする場合は、次のように実行できます。

YourObject *object = (YourObject*)[filtered objectAtIndex:0];

お役に立てれば。

于 2012-06-16T02:10:11.840 に答える
12
NSUInteger indexOfObject10 = [myArray indexOfObjectPassingTest:^(id obj, NSUInteger idx, BOOL *stop){
    MyObject *object = (MyObject *)obj;
    return [object.number == 10];
}];

MyObject *object10 = myArray[indexOfObject10];
于 2012-06-16T02:02:19.620 に答える
1

私は、NSArrayのブロック拡張機能を使用して、より自然にそれらと「対話」し、より少ないコードを記述できるようにすることを好みます。Smalltalkコレクションの専門用語の行にあるもの:

  • 探知:
  • 選択する:
  • inject:into:

あなたの場合、私は以下を使用します:

MyObject* theObject = [myArray detect:^(MyObject* each){
     return each.number == 10;
}];

ここに、NSArrayへのその拡張の可能な実装があります

typedef BOOL (^BlockPredicate) (id element);

-(id) detect:(BlockPredicate) predicateBlock{
     for (id each in self) {
        if (predicateBlock(each)) {
            return each;
        }
    }
    return nil;
}

この種のツールは本当に役に立ちます。それらもお役に立てば幸いです。

于 2012-06-16T03:54:10.760 に答える
0

多分このようなもの:

NSObject *retrieveObject = [[NSObject alloc] init];
retrieveObject.number = 1;

NSObject *anObject = [yourMutableArray objectAtIndex:[yourMutableArray indexOfObjectIdenticalTo:testObject]];

まず、取得したい配列内のオブジェクト(この場合は「1」)と同じ番号のオブジェクトを作成します。次の行では、取得するときにその値を別のオブジェクトに割り当てたいと想定しているのでobjectAtIndex:、インデックスパラメータを別のメソッド、indexOfObjectIdenticalTo:メソッド、そのメソッドのパラメータをretriveObjectオブジェクトとする標準メソッドを使用して取得します。つまり、これは、retrieveObjectと同じ最初のオブジェクト(同じ番号を持つことを意味します)を配列で探し、そのオブジェクトのインデックスを返し、その値をobjectAtIndexメソッドに渡します。

お役に立てれば!

于 2012-06-16T02:04:55.873 に答える