Как сохранить определение блока, которое что-то возвращает, в локальной переменной

#ios #objective-c #objective-c-blocks #typedef

#iOS #objective-c #objective-c-blocks #typedef

Вопрос:

Мне кажется немного странным, что, когда my block ничего не возвращает, я могу записать это в переменную, прежде чем передавать ее методу потребителя. Но как только я добавляю возвращаемое значение в блок typedef , я начинаю получать предупреждение

Сценарий 1: Блок ничего не возвращает // объявление

 typedef void (^MYConfigureBlock)(MYFeedCell *cell, NSIndexPath *indexPath);
  

//использование

   MYConfigureBlock block  = ^(MYFeedCell *cell, NSIndexPath *indexPath){
    [cell setActionDelegate:self];
    return nil;
};

MYFeedSource *fds = [[MYFeedSource alloc]initWithTableView:self.tableView
                                                    configurationBlock:block];
[fds setErrorMessage:@"No feeds yet. Is everyone even alive?"];
self.feedDataSource = fds;
  

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

Проблема здесь

 typedef MYFeedCell* (^MYConfigureBlock)(MYFeedCell *cell, NSIndexPath *indexPath);
  

Теперь, как я могу переписать следующие инструкции, чтобы не было ошибок. И почему это не работает как обычно с возвращаемым типом?

 MYConfigureBlock block  = ^(MYFeedCell *cell, NSIndexPath *indexPath){
    [cell setActionDelegate:self];
    return nil;
};
  

Ошибка

Отправка ‘MYFeedCell *’ параметру несовместимого типа ‘MYConfigureBlock’ (он же ‘MYFeedCell *(^) (MYFeedCell * __strong, NSIndexPath *__strong)’)

Код, использующий блок

 - (UITableViewCell*)tableView:(UITableView*)aTableView cellForRowAtIndexPath:(NSIndexPath*)indexPath {

            self.cellConfigureBlock(nil, indexPath);
}
  

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

1. Первый параметр отличается в объявлении и использовании; ( UITableViewCell *cell и MYFeedCell *cell ).

2. исправлено. я ввел вопрос, поэтому, пожалуйста, игнорируйте параметры и имена переменных. хотя спасибо

3. Похоже, ошибка в вызывающем коде block . Опубликуйте это.

4. вы хотите увидеть объявление метода init ? -(instancetype)initWithTableView:(UITableView*)aTableView configurationBlock:(MYConfigureBlock)block

5.Нет, я хотел бы увидеть код, который использует block .

Ответ №1:

Вы должны включить возвращаемый тип блока в подпись блока, потому что компилятор не сможет определить возвращаемый тип блока, если вы вернетесь nil . Попробуйте это:

 MYConfigureBlock block = ^ MyFeedCell* (MYFeedCell *cell, NSIndexPath *indexPath){
    [cell setActionDelegate:self];
    return nil;
};
  

Обратите внимание, что ваш исходный код не вызывает ошибку компиляции, если вы возвращаете MyFeedCell объект, потому что компилятор может определить возвращаемый тип:

 MYConfigureBlock block = ^(MYFeedCell *cell, NSIndexPath *indexPath){
    [cell setActionDelegate:self];
    return cell;
};
  

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

1. идеально! это работает . Я пробовал что-то подобное, но с неправильным расположением.

Ответ №2:

     /** PROBLEM is the nil return*/
    //  return nil;

    //SHOULD return a valid type,which is expected.----Here Cell object should return.
    return cell;