#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;