1

NSMutableArray pages複数のオブジェクト ( のインスタンス)を持つ がありますPage。各Pageインスタンスには、UUID とコンテンツなどのその他のプロパティがあります。がpage変更されると、UUID 以外のすべてが変更される可能性があります。Page変更後、特定ののインデックスをpagesを使用して調べたいと思いますindexOfObject:。UUID を使用して、探しているインデックスを特定しましたが、これは問題なく機能します。

NSMutableArray *uuids = [[NSMutableArray alloc] init];
for (int i = 0; i < [self.pages count]; i++) {
    [uuids addObject:[[pages objectAtIndex:i] uuid]];
}

NSUInteger indexOfPage = [uuids indexOfObject:page.uuid];

私の質問は、これを行うためのよりエレガントな方法があるかどうかです。本当に必要なのは、特定の UUID を持つPageオブジェクトのインデックスだけです。pages

- (NSIndexSet *)indexesOfObjectsPassingTest:(BOOL (^)(id obj, NSUInteger idx, BOOL *stop))predicateまたはありますが indexOfAccessibilityElement:<#(id)#>、これらのいずれかが問題の解決にどのように役立つかはよくわかりません。

4

3 に答える 3

3

isEqual:メソッドPageを次のようにサブクラス化します。

- (BOOL) isEqual: (Page *) otherPage
{
    if (![otherPage isKindOfClass:[Page class]]) {
        return NO;
    }

    return [self.UUID isEqualToString: otherPage.UUID];
}

その後、indexOfObject:正しく動作します。

Apple の NSArray ドキュメントから:

インデックス 0 から開始して、一致が見つかるか配列の最後に到達するまで、配列の各要素に isEqual: メッセージが送信されます。このメソッドは、各 isEqual: メッセージに anObject パラメータを渡します。isEqual: (NSObject プロトコルで宣言) が YES を返す場合、オブジェクトは等しいと見なされます。

于 2012-07-01T09:59:34.980 に答える
2

NSArrayドキュメントから:

配列の各要素にはisEqual:、一致が見つかるか、配列の最後に到達するまでメッセージが送信されます。

したがって、2つのページのUUIDが同じ場合isEqual:に返されるようにオーバーライドできます。YES

- (BOOL)isEqual:(id)object {
    if (![object isKindOfClass:[Page class]]) {
        return NO;
    }

    Page *otherPage = object;
    return [self.uuid isEqualToString:otherPage.uuid];
}
于 2012-07-01T09:57:40.047 に答える
0

ページがすべてのページの配列であると仮定すると、述語を使用してこのようにすることができます。

predicate = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"(UUID == %@)", searchUUID]];
filteredArray = [pages filteredArrayUsingPredicate:predicate];

そして、uuidが一意であると仮定して、フィルター処理された配列のobjectAtIndex:0にあるはずのオブジェクトを取得したら、そのオブジェクトのインデックスを尋ねることができます。

NSUInteger indexOfPage = [pages indexOfObject:theObject];

于 2012-07-01T09:55:11.350 に答える