2014-11-16 2 views
1

я определил блок в одном из моих заголовков так:Как я могу сделать блок пропускает тип параметра определенного класса?

typedef MyViewClass* (^MyBlock)(UIViewController *viewController); 

мне нужно использовать этот блок в нескольких случаях, и я в настоящее время сделать это:

object.block = ^MyViewClass *(UIViewController *viewController) { 
    ... 
    return something; 
}; 

Как могу ли я определить свой блок, поэтому, когда я его использую, я могу использовать любой подкласс UIViewController непосредственно в списке параметров? Например, UITableViewController. Когда я попробую сейчас, я получаю предупреждение о компиляторе. Наверное, я ищу что-то по строкам instancetype, только для параметра.

ответ

0

Вы не можете. Это не отличается от типов параметров метода. У вас не может быть метода в каком-то базовом классе, который принимает UIViewController, а затем при реализации метода в некотором производном классе метод не может внезапно быть UITableViewController.

Определение блока аналогично. Он определен одним способом, и все реализации должны соблюдать это определение.

Лучшее, что вы можете сделать, это создать локальную переменную в конкретном блоке. Пример:

object.block = ^MyViewClass *(UIViewController *viewController) { 
    UITableViewController *tableViewController = (UITableViewController *)viewController; 
    ... 
    return something; 
}; 

Конечно, это предполагает, что вы знаете, что блок вызывающий абонент будет действительно пройти UITableViewController.

+0

Это был мой страх, я хотел попробовать и приложить бросок в определении блока. P.S; Кстати, я думал об этом по сравнению с методом, заголовок может указывать 'UIViewController', но в любой реализации вы можете без проблем проходить через подклассы' UIViewController'. – Ricky