从Apples iADSuite标签示例中,有一个使用委托定义的变量。
UIViewController<BannerViewContainer> *_currentController;
以后它会被投射
_currentController = (UIViewController<BannerViewContainer> *)_tabBarController.selectedViewController;
在宣言中使用“BannerViewContainer”的重要性是什么,它与后来演员的关系以及在这里发生了什么?
此致
吉姆
答案 0 :(得分:0)
这里与代表无关。 BannerViewContainer
是protocol。 (您可能会感到困惑,因为委托通常是通过协议定义的。)
使用包含角度的协议名称声明变量或参数意味着分配给它的任何内容必须是符合该协议的对象:如果您尝试传递UIViewController
的实例或其某些子类,则除非该实例属于UIViewController
子类,否则将获得编译器警告,该子类声明与BannerViewContainer
协议的一致性。 (也就是说,如果其头文件读取FooViewController
,则可以传递@interface FooViewController : UIViewController <BannerViewContainer>
的实例。)
您稍后看到的演员表与许多演员表的模式相同:这是程序员知道他所分配的对象符合该变量要求的情况,但他使用的引用没有匹配的声明。也就是说,标签栏控制器只知道它所选择的视图控制器是UIViewController
(或其任何子类),但程序员知道他放入标签栏的视图都符合UIViewController
子类到BannerViewContainer
协议。