85 votes

À quoi sert l'argument BOOL *stop pour enumerateObjectsUsingBlock: ?

J'ai utilisé enumerateObjectsUsingBlock: pour mes besoins d'énumération rapide, et j'ai du mal à comprendre l'utilisation de l'option BOOL *stop dans le bloc d'énumération.

El NSArray états de référence de la classe

stop : Une référence à une valeur booléenne. Le bloc peut définir la valeur à YES à arrêter la poursuite du traitement du tableau. Le site stop est un argument de sortie seulement uniquement. Vous ne devriez jamais mettre ce booléen à la valeur YES au sein du bloc.

Alors, bien sûr, je peux ajouter ce qui suit dans mon bloc pour arrêter l'énumération :

if (idx == [myArray indexOfObject:[myArray lastObject]]) {
    *stop = YES;
}

D'après ce que j'ai pu dire, pas explicitement. *stop a YES n'a pas d'effets secondaires négatifs. L'énumération semble s'arrêter automatiquement à la fin du tableau. Tout comme l'utilisation de *stop vraiment nécessaire dans un bloc ?

156voto

Josh Caswell Points 40397

El stop de l'argument du bloc vous permet d'arrêter l'énumération. prématurément . C'est l'équivalent de break à partir d'un for boucle. Vous pouvez l'ignorer si vous voulez passer en revue chaque objet du tableau.

for( id obj in arr ){
    if( [obj isContagious] ){
        break;    // Stop enumerating
    }

    if( ![obj isKindOfClass:[Perefrigia class]] ){
        continue;    // Skip this object
    }

    [obj immanetizeTheEschaton];
}

[arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    if( [obj isContagious] ){
        *stop = YES;    // Stop enumerating
        return;
    }

    if( ![obj isKindOfClass:[Perefrigia class]] ){
        return;    // Skip this object
    }

    [obj immanentizeTheEschaton];
}];

Il s'agit d'un paramètre externe car il doit être défini à l'intérieur de votre bloc, mais lu à l'intérieur de l'application enumerateObjectsUsingBlock: de la même manière NSError sont généralement renvoyés à votre code à partir d'appels au framework.

- (void)enumerateObjectsUsingBlock:(void (^)(id obj, NSUInteger idx, BOOL *stop))block {
    // N.B: This is probably not how this method is actually implemented!
    // It is just to demonstrate how the out parameter operates!

    NSUInteger idx = 0;
    for( id obj in self ){

        BOOL stop = NO;

        block(obj, idx++, &stop);

        if( stop ){
            break;
        }
    }
}

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