Asignar una variable dentro de un bloque a una variable fuera de un bloque

382

Me sale un error

La variable no es asignable (falta el especificador de tipo de bloque __)

en la linea aPerson = participant;. ¿Cómo puedo asegurarme de que el bloque pueda acceder a la aPersonvariable y que la aPersonvariable pueda ser devuelta?

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;
tommi
fuente

Respuestas:

780

Debe usar esta línea de código para resolver su problema:

__block Person *aPerson = nil;

Para obtener más detalles, consulte este tutorial: bloques y variables

Devarshi
fuente
101
Tenga en cuenta que __blocktiene el prefijo dos guiones bajos.
Eric Brotto
12
usando __blockmi error desaparecido, pero el valor no se retiene fuera del bloque. Cualquier ayuda aquí
Usuario16119012
77
El bloque se llama mucho después de donde parece que debería llamarse, en otras palabras, los bloques no se ejecutan 'de inmediato'.
Tom Andersen
1
Si los bloques no se ejecutan INMEDIATAMENTE, esta respuesta no debe aceptarse, ya que eso es un factor decisivo.
durazno
3
Esta respuesta es correcta con respecto a la pregunta publicada, no dude en publicar otra pregunta si tiene un escenario diferente en mente.
Devarshi
40

Solo un recordatorio de un error que cometí yo también, el

 __block

La declaración debe hacerse cuando se declara por primera vez la variable, es decir, FUERA del bloque, no dentro de él. Esto debería resolver los problemas mencionados en los comentarios sobre la variable que no retiene su valor fuera del bloque.

Denis Balko
fuente
18

Simplemente use el __blockprefijo para declarar y asignar cualquier tipo de variable dentro de un bloque.

Por ejemplo:

__block Person *aPerson = nil;

__block NSString *name = nil;
Umesh Sawant
fuente
10

Para asignar una variable dentro del bloque que fuera del bloque siempre use el especificador __block antes de esa variable, su código debería ser así:

__block Person *aPerson = nil;
Gaurav
fuente
10
__block Person *aPerson = nil;
Ketan Patel
fuente
3

Pruebe __weaksi recibe alguna advertencia sobre el ciclo de retención; de lo contrario, use__block

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

Ahora puedes referir weakPersonobjetos dentro del bloque.

PradeepKN
fuente
3

sí, el bloque es la funcionalidad más utilizada, por lo tanto, para evitar el ciclo de retención, debemos evitar usar la variable fuerte, incluido self dentro del bloque, inspirar usar _weak o weakself.

usuario6311313
fuente
0

Cuando vi el mismo error, traté de resolverlo como:

   __block CGFloat docHeight = 0.0;


    [self evaluateJavaScript:@"document.height" completionHandler:^(id height, NSError *error) {
        //height
        NSLog(@"=========>document.height:@%@",height);
        docHeight = [height floatValue];
    }];

y está funcionando bien

Simplemente agregue " __block " antes de Variable.

Sr. Javed Multani
fuente