2012-07-01 3 views
1

나는 NSMutableArraypages에 여러 개체 (인스턴스 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를 가진 pages에있는 Page 오브젝트의 인덱스입니다.

- (NSIndexSet *)indexesOfObjectsPassingTest:(BOOL (^)(id obj, NSUInteger idx, BOOL *stop))predicate 또는 indexOfAccessibilityElement:<#(id)#>이 있습니다. 그러나이 중 하나가 내 문제를 해결하는 데 어떻게 도움이 될지 잘 모르겠습니다.

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

그리고 당신은 objectAtIndex에 있어야 개체, 일단 : 필터링 된 배열에 공을 당신의 UUID를 가정

답변

3

서브 클래스는 다음과 같이 Page에서 isEqual: 방법 :

- (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

페이지를 가정하는 것은 모든 페이지의 배열이며, 술어를 사용하여이 방법이 될 수 있습니다 이 객체의 색인을 요청할 수 있습니다.

NSUInteger indexOfPage = [pages indexOfObject : theObject]; NSArray를 워드 프로세서에서

2

: 일치하는 것이 또는 배열의 끝에 도달 할 때까지 상기 어레이의 각 요소는 isEqual: 메시지를 보내

. 두 페이지가 동일한 UUID가있는 경우는 YES을 반환하도록

그래서 당신은 isEqual:을 대체 할 수 있습니다.

- (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

관련 문제