web-dev-qa-db-fra.com

Affecter une variable à l'intérieur d'un bloc à une variable à l'extérieur d'un bloc

Je reçois une erreur

La variable n'est pas assignable (spécificateur de type __block manquant)

sur la ligne aPerson = participant;. Comment puis-je m'assurer que le bloc peut accéder à la variable aPerson et que la variable aPerson peut être renvoyée?

Person *aPerson = nil;

[participants enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {   
    Person *participant = (Person*)obj;

    if ([participant.gender isEqualToString:@"M"]) {
        aPerson = participant;
        *stop = YES;
    }
}];

return aPerson;
373
tommi

Vous devez utiliser cette ligne de code pour résoudre votre problème:

__block Person *aPerson = nil;

Pour plus de détails, référez-vous à ce tutoriel: Blocs et Variables

760
Devarshi

Juste un rappel d’une erreur que j’ai moi-même faite, le

 __block

la déclaration doit être effectuée lors de la première déclaration de la variable, c'est-à-dire OUTSIDE du bloc et non à l'intérieur de celui-ci. Cela devrait résoudre les problèmes mentionnés dans les commentaires sur la variable ne conservant pas sa valeur en dehors du bloc.

39
Denis Balko

Utilisez simplement le préfixe __block pour déclarer et affecter tout type de variable dans un bloc.

Par exemple:

__block Person *aPerson = nil;

__block NSString *name = nil;
17
Umesh Sawant
__block Person *aPerson = nil;
10
Ketan Patel

Pour affecter une variable à l'intérieur d'un bloc qui, en dehors de celui-ci, utilisez toujours le spécificateur __block avant cette variable, votre code devrait ressembler à ceci: -

__block Person *aPerson = nil;
10
Gaurav

Essayez __weak si vous recevez un avertissement concernant le cycle de conservation, sinon utilisez __block

Person *strongPerson = [Person new];
__weak Person *weakPerson = person;

Vous pouvez maintenant vous référer à weakPerson objet dans le bloc.

3
Pebby

yes block sont les fonctionnalités les plus utilisées. Par conséquent, afin d'éviter le cycle de conservation, nous devons éviter d'utiliser la variable strong, y compris self à l'intérieur du bloc, mais utilisez plutôt _weak ou faible.

3
user6311313