Назначьте переменную внутри блока переменной переменной вне блока

Я получаю сообщение об ошибке

Переменная не назначается (отсутствует спецификатор типа __block)

на линии aPerson = participant;. Как я могу убедиться, что блок может получить доступ к переменной aPerson, а переменная aPerson может быть возвращена?

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;

Ответ 1

Вам нужно использовать эту строку кода для решения вашей проблемы:

__block Person *aPerson = nil;

Подробнее см. в этом руководстве: Блоки и переменные.

Ответ 2

Просто напоминание об ошибке, которую я сделал сам,

 __block

объявление должно выполняться при первом объявлении переменной, то есть ВНЕШНЕГО блока, а не внутри него. Это должно устранить проблемы, упомянутые в комментариях о переменной, не сохраняющей ее значение вне блока.

Ответ 3

Просто используйте префикс __block для объявления и назначения любого типа переменной внутри блока.

Например:

__block Person *aPerson = nil;

__block NSString *name = nil;

Ответ 4

Чтобы назначить переменную внутри блока, которая вне блока всегда использует спецификатор __block перед этой переменной, ваш код должен выглядеть следующим образом: -

__block Person *aPerson = nil;

Ответ 5

__block Person *aPerson = nil;

Ответ 6

Попробуйте __weak, если вы получите предупреждение о сохранении цикла, используйте __block

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

Теперь вы можете ссылаться на объект weakPerson внутри блока.

Ответ 7

да блок - самая используемая функциональность, поэтому, чтобы избежать цикла сохранения, мы должны избегать использования сильной переменной, в том числе внутри внутри блока, воодушевить использование слабой или слабой стороны.

Ответ 8

Я тоже сделал себя,

 __block

объявление должно выполняться при первом объявлении переменной, то есть ВНЕШНЕГО блока, а не внутри него. Это должно устранить проблемы, упомянутые в комментариях о переменной, не сохраняющей ее значение вне блока.

__block Person *aPerson = nil;

Ответ 9

Когда я увидел ту же ошибку, я попытался устранить ее следующим образом:

   __block CGFloat docHeight = 0.0;


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

и работает нормально

Просто добавьте __block перед переменной.