Разъяснение вокруг UIViewController <Delegate>* _variable; объявление в примере с вкладками iAdSuite (iOS) - PullRequest
2 голосов
/ 16 марта 2012

В примере с закладками Apples iADSuite есть переменная, определенная с делегатом.

UIViewController<BannerViewContainer> *_currentController;

позже он отлит как таковой

_currentController = (UIViewController<BannerViewContainer> *)_tabBarController.selectedViewController;

Каково значение использования "BannerViewContainer" в объявлении, как оно относится к более позднему приведению и что здесь происходит под прикрытием?

Привет

Jim

1 Ответ

0 голосов
/ 16 марта 2012

Здесь нет ничего общего с делегатами. BannerViewContainer - это протокол . (Вы можете быть смущены, потому что делегирование часто определяется с помощью протоколов.)

Объявление переменной или параметра с именем протокола в квадратных скобках означает, что все, что ему назначено, должно быть объектом, соответствующим этому протоколу: если вы попытаетесь передать экземпляр UIViewController или некоторый его подкласс, вы получить предупреждение компилятора, если этот экземпляр не имеет подкласса UIViewController, который объявляет о соответствии протоколу BannerViewContainer. (То есть вы можете передать экземпляр FooViewController, если его заголовочный файл читает @interface FooViewController : UIViewController <BannerViewContainer>.)

Приведение, которое вы увидите позже, следует тому же шаблону, что и многие приведения: это тот случай, когда программист знает, что объект, который он назначает, соответствует требованиям для этой переменной, но используемая ссылка не имеет соответствующего объявления. То есть контроллер панели вкладок знает только, что его выбранный контроллер представления является UIViewController (или любым его подклассом), но программист знает, что все представления, которые он поместил в панель вкладок, являются UIViewController подклассами, соответствующими BannerViewContainer протокол.

...