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

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;
Tommi
источник

Ответы:

780

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

__block Person *aPerson = nil;

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

Devarshi
источник
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;
Gaurav
источник
3

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

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

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

PradeepKN
источник
3

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

user6311313
источник
0

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

   __block CGFloat docHeight = 0.0;


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

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

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

Мистер Джавед Мултани
источник