Liste des éléments avant un élément donné dans un NSOrderedSet
colas_
Membre
Voilà une petite catégorie que je partage !
//
// NSOrderedSet+PreviousAndNextObjects.h
//
#import <Foundation/Foundation.h>
@interface NSOrderedSet (PreviousAndNextObjects)
- (NSOrderedSet *)objectsBefore:(id)anObject
includingThisObject:(BOOL)includingThisObject ;
- (NSOrderedSet *)objectsAfter:(id)anObject
includingThisObject:(BOOL)includingThisObject ;
@end
et
//
// NSOrderedSet+PreviousAndNextObjects.m
#import "NSOrderedSet+PreviousAndNextObjects.h"
@implementation NSOrderedSet (PreviousAndNextObjects)
#pragma mark - Méthode générique
- (NSOrderedSet *)objectsRelativelyTo:(id)anObject
before:(BOOL)takeBeforeObjects
after:(BOOL)takeAfterObjects
includeReferenceObject:(BOOL)includeReferenceObject
{
NSMutableOrderedSet * result = [[NSMutableOrderedSet alloc] init] ;
__block BOOL referenceObjectPassed = NO ;
[self enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop)
{
BOOL isCurrentObjectReferenceObject = [anObject isEqualTo:obj] ;
referenceObjectPassed = referenceObjectPassed || isCurrentObjectReferenceObject ;
if (takeBeforeObjects && !referenceObjectPassed)
{
[result addObject:obj] ;
}
BOOL referenceObjectStrictlyPassed = referenceObjectPassed && !isCurrentObjectReferenceObject ;
if (takeAfterObjects && referenceObjectStrictlyPassed)
{
[result addObject:obj] ;
}
if (includeReferenceObject && isCurrentObjectReferenceObject)
{
[result addObject:obj] ;
}
}];
return result ;
}
#pragma mark - Méthodes à implémenter
- (NSOrderedSet *)objectsBefore:(id)anObject
includingThisObject:(BOOL)includingThisObject
{
return [self objectsRelativelyTo:anObject
before:YES
after:NO
includeReferenceObject:includingThisObject] ;
}
- (NSOrderedSet *)objectsAfter:(id)anObject
includingThisObject:(BOOL)includingThisObject
{
return [self objectsRelativelyTo:anObject
before:NO
after:YES
includeReferenceObject:includingThisObject] ;
}
@end
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
- Récupérer l'index idx de l'objet de référence
- et à partir de là construire un NSRange des objets qu'on veut (par exemple de 0 à idx si on veut les objets "before, including reference object)
- De là dès qu'on a un range, on peut demander au NSOrderedSet tous les objets dont l'index est dans ce range, en construisant un NSIndexSet et appelant objectsAtIndexes avec.
C'est qu'une idée comme une autre hein, les 2 marchent, c'est juste pour proposer une approche alternative