Liste des éléments avant un élément donné dans un NSOrderedSet

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


 


Réponses

  • AliGatorAliGator Membre, Modérateur
    janvier 2014 modifié #2
    Sympa mais je serai parti sur une autre idée :
    - 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.
    - (NSOrderedSet *)objectsBefore:(id)anObject
    includingThisObject:(BOOL)includingThisObject
    {
    NSUInteger idx = [self indexOfObject:anObject];
    if (idx == NSNotFound) return nil;
    if ((idx == 0) && !includingThisObject) return [NSOrderedSet orderedSet]; // return empty set

    NSRange range = NSMakeRange(0 , includingThisObject?idx:idx-1);

    NSIndexSet* indexes = [NSIndexSet indexSetWithIndexesInRange:range];
    NSArray* objects = [self objectsAtIndexes:indexes];
    return [NSOrderedSet orderedSetWithArray:objects];
    }
    C'est qu'une idée comme une autre hein, les 2 marchent, c'est juste pour proposer une approche alternative ;)
Connectez-vous ou Inscrivez-vous pour répondre.