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

#objective-c #compiler-errors #objective-c-blocks

#цель-c #ошибки компилятора #цель-c-блоки

Вопрос:

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

Переменная не может быть назначена (отсутствует __спецификатор типа блока)

в строке 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;
 

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

Комментарии:

1. Пожалуйста, обратите внимание, что __block перед ним стоит два символа подчеркивания.

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

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

4. Если блоки не запускаются СРАЗУ, то этот ответ не должен быть принят, так как это делает его серьезным препятствием для сделки.

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

Ответ №2:

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

  __block
 

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

Ответ №3:

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

Например:

 __block Person *aPerson = nil;

__block NSString *name = nil;
 

Ответ №4:

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

 __block Person *aPerson = nil;
 

Ответ №5:

 __block Person *aPerson = nil;
 

Ответ №6:

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

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

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

Ответ №7:

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

Ответ №8:

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

    __block CGFloat docHeight = 0.0;


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

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

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