在Google Analytics iOS tutorial中,有以下一行:
id<GAITracker> tracker = [[GAI sharedInstance] defaultTracker];
为什么GAITracker
变量用“&lt;”括起来和“&gt;”?有什么想法吗?
答案 0 :(得分:4)
这意味着你有一个id
类型的变量(任何对象),但只有符合GAITracker协议的变量。
一般语法如下:
type<protocol1,protocol2> varname
这指定了type
类型的变量,该变量只能保存符合括号内列表中所有协议的对象。
答案 1 :(得分:1)
Linuxios解释了语法的含义。我会试着解释一下原因......
当您编写@Protocol
时,您可以定义许多符合协议的对象可以实现的必需和可选方法。
假设我有@Protocol
,如下所示:
@Protocol FooProtocol
@required
- (void)doStuff;
@End
现在,符合<FooProtocol>
的所有内容都必须实现一个名为doStuff
的方法。
所以,如果我这样做:
NSObject *bar = [[Bar alloc] init];
如果我尝试这样做:
[bar doStuff];
Xcode会告诉我NSObject
没有可见的选择器“doStuff”。
但是,如果我将我的代码更改为:
NSObject<FooProtocol> *bar = [[Bar alloc] init];
现在Xcode可以正常使用:
[bar doStuff];
因为虽然NSObject
仍然没有可见的选择器,“doStuff”,但我实现的FooProtocol
确实有一个名为“doStuff”的选择器,bar
不是只是一个NSObject,但具体来说,它是一个符合FooProtocol
的NSObject。
现在,在这个解释中,这有点愚蠢。但是,当您希望UIViewController
作为TextFieldDelegate
时,它会特别有用。常规的UIViewController
无法做到这一点。
但是,UIViewController<TextFieldDelegate>
可以履行此职责,因为它不仅仅是UIViewController
,而是符合UIViewController
协议的TextFieldDelegate
。