2012-07-01 12 views
1

我有一個NSMutableArraypages與多個對象(的Page實例)。每個Page實例都有一個UUID和其他屬性,如內容。當page更改時,除UUID外,所有內容都可能更改。更改後,我想通過使用indexOfObject:找出pages中某個Page的索引。我用的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的pagesPage對象的索引。

- (NSIndexSet *)indexesOfObjectsPassingTest:(BOOL (^)(id obj, NSUInteger idx, BOOL *stop))predicateindexOfAccessibilityElement:<#(id)#>但我真的不知道這些如何能幫助我解決我的問題。

回答

3

子類的isEqual:方法在Page如下:

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

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

然後indexOfObject:將正常工作。

Apple's NSArray documentation:直到找到一個匹配 消息或者到達陣列的末尾:

在索引0處開始,數組的每個元素被髮送的isEqual一個。 此方法將anObject參數傳遞給每個isEqual:消息。 如果isEqual對象被認爲是相等的:(在NSObject 協議中聲明)返回YES。

0

可能是這樣使用的謂詞,假設網頁是你的所有頁面的數組:

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

而且一旦你的對象,這應該是objectAtIndex:0的濾波陣列中假設你的UUID是獨一無二的,你可以要求該對象的索引:

NSUInteger indexOfPage = [頁indexOfObject:theObject]。

2

從NSArray的文檔:

直到找到匹配或到達陣列的端部的陣列的每個元件被髮送的isEqual:消息。

所以,你可以覆蓋isEqual:,使其返回YES如果兩個頁面具有相同的UUID。

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

    Page *otherPage = object; 
    return [self.uuid isEqualToString:otherPage.uuid]; 
} 
+1

謝謝Hejazi。只是想知道我是否真的需要isKindOfClass。我已經實施了Ahsley's,它工作得很好,但是也許你的答案是正確和節省的。你能解釋你爲什麼要檢查isKindOfClass嗎? –

+0

以防萬一。所以,當我訪問'uuid'時,我知道它在那裏,我沒有和另一個類的對象進行比較。 – Hejazi

相關問題