Присвойте переменную внутри блока переменной за пределами блока


382

Я получаю ошибку

Переменная не присваивается (отсутствует спецификатор типа __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;

Ответы:


780

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

__block Person *aPerson = nil;

Для получения более подробной информации, пожалуйста, обратитесь к этому руководству: блоки и переменные


101
Обратите внимание, что __blockс префиксом с двумя подчеркиваниями.
Эрик Бротто

12
используя __blockмою ошибку, но значение не сохраняется вне блока. Любая помощь здесь
User16119012

7
Блок вызывается хорошо после того, как он выглядит так, как будто он должен быть вызван, другими словами, блоки не запускаются «сразу».
Том Андерсен

1
Если блоки не работают ПРЯМО В ДЕЙСТВИИ, тогда это не должен быть принят ответ, так как это делает его серьезным нарушителем.
Дуразно

3
Этот ответ правильный по отношению к опубликованному вопросу, не стесняйтесь задавать другой вопрос, если у вас есть другой сценарий.
Деварши

40

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

 __block

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


18

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

Например:

__block Person *aPerson = nil;

__block NSString *name = nil;

10

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

__block Person *aPerson = nil;


3

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

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

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


3

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


0

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

   __block CGFloat docHeight = 0.0;


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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.