34 votes

Le SDK iOS fournit-il des files d'attente et des piles ?

Je suis en train d'écrire une application iPhone et je suis surpris qu'il ne semble pas y avoir de classes NSQueue ou NSStack dans la bibliothèque d'Apple. Cadre de base . Je vois qu'il serait assez facile d'élaborer le mien, en commençant par une NSMutableArray Je vais donc le faire, à moins que j'aie oublié quelque chose. Ai-je manqué quelque chose ?

29voto

Tommy Herbert Points 4314

Voici ma classe Stack, au cas où elle serait utile à ceux qui viendront après moi. Comme vous pouvez le voir, la méthode pop implique suffisamment de code pour qu'on veuille la factoriser.

Stack.h :

#import <Foundation/Foundation.h>

@interface Stack : NSObject {
    NSMutableArray *contents;
}

- (void)push:(id)object;
- (id)pop;

@end

Pile.m

#import "Stack.h"

@implementation Stack

// superclass overrides

- (id)init {
    if (self = [super init]) {
        contents = [[NSMutableArray alloc] init];
    }
    return self;
}

- (void)dealloc {
    [contents release];
    [super dealloc];
}

// Stack methods

- (void)push:(id)object {
    [contents addObject:object];
}

- (id)pop {
    id returnObject = [[contents lastObject] retain];
    if (returnObject) {
            [contents removeLastObject];
    }
    return [returnObject autorelease];
}

@end

2 votes

Pour la méthode pop, vous pouvez économiser un peu de frappe en utilisant [contents lastObject]. Cela retournera nil si le tableau est vide. J'ai fini par implémenter les méthodes comme une catégorie sur NSMutableArray. Merci pour le code !

1 votes

Personnellement, j'ajouterais probablement l'élément pop pour NSMutableArray via une catégorie et utiliser un NSMutableArray directement partout où j'avais besoin d'une pile, plutôt que de créer une nouvelle pile entièrement Stack classe. La plupart des langages que j'ai utilisés auparavant n'ont pas de classes de pile dédiées et utilisent des tableaux comme piles. Je suppose que je peux voir l'élégance, du point de vue de la lisibilité, d'avoir une classe qui peut uniquement être utilisé comme une pile, cependant.

22voto

Michael W. Points 396

Pour autant que je sache, il n'y a pas de classe générique disponible. Essayez d'utiliser NSMutableArray, ajoutez via addObject et récupérez le premier/dernier via objectAtIndex et removeObjectAtIndex.

1 votes

Notez que removeObjectAtIndex est une opération O(n), donc ce n'est probablement pas la meilleure approche pour les files d'attente lorsque le nombre d'éléments est censé être important. L'utilisation d'une liste chaînée (qui permet l'ajout et le retrait efficaces d'éléments à partir de n'importe quel point) est probablement bien meilleure, mais malheureusement, il s'agit d'un autre type de collection commun absent de Foundation, et vous devrez donc l'implémenter également.

7voto

Mischa Points 1005

Un autre moyen simple serait d'étendre NSMutableArray en utilisant les catégories de l'Objective C. Vous pouvez le faire en ajoutant deux fichiers à votre projet :

NSMutableArray+Stack.h

@interface NSMutableArray (StackExtension)

- (void)push:(id)object;
- (id)pop;

@end

NSMutableArray+Stack.m

#import "NSMutableArray+Stack.h"

@implementation NSMutableArray (StackExtension)

- (void)push:(id)object {
    [self addObject:object];
}

- (id)pop {
    id lastObject = [self lastObject];
    [self removeLastObject];
    return lastObject;
}

@end

Maintenant, vous pouvez utiliser un NSMutableArray dans tous les autres fichiers de votre projet comme une pile et appeler push o pop sur cet objet. N'oubliez pas de #import NSMutableArray+Stack.h dans ces fichiers. Voici un exemple de code qui vous permettra d'utiliser votre nouvelle fonction NSMutableArray comme une pile :

NSMutableArray *myStack = [[NSMutableArray alloc] init]; // stack size = 0

NSString *aString = @"hello world";
[myStack push:myString];            // stack size = 1

NSString *anotherString = @"hello universe";
[myStack push:anotherString];       // stack size = 2

NSString *topMostStackObject; 

topMostStackObject = [myStack pop]; // stack size = 1
NSLog("%@",topMostStackObject);

topMostStackObject = [myStack pop]; // stack size = 0
NSLog("%@",topMostStackObject);

La sortie du journal sera :

hello universe
hello world

6voto

occulus Points 10906

J'interviens un peu tard, mais connaissez-vous les CHDataStructures ?

http://cocoaheads.byu.edu/code/CHDataStructures

2 votes

C'est génial ! Merci de partager avec nous !

5voto

portforwardpodcast Points 2044

J'ai mis un objet file d'attente iOS Objective C fonctionnel sur GitHub. Le code est tiré de divers articles et n'est en aucun cas ma propriété.

https://github.com/esromneb/ios-queue-object/

Si vous voyez des problèmes, merci de forker, et de faire une demande de pull !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X