it-swarm.com.ru

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

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

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

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

__block Person *aPerson = nil;

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

754
Devarshi

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

 __block

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

38
Denis Balko

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

Например:

__block Person *aPerson = nil;

__block NSString *name = nil;
17
Umesh Sawant
__block Person *aPerson = nil;
10
Ketan Patel

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

__block Person *aPerson = nil;
10
Gaurav

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

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

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

3
Pebby

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

3
user6311313