用“<”括起来的变量和“>”

时间:2014-01-18 20:16:42

标签: ios objective-c

在Google Analytics iOS tutorial中,有以下一行:

id<GAITracker> tracker = [[GAI sharedInstance] defaultTracker];

为什么GAITracker变量用“&lt;”括起来和“&gt;”?有什么想法吗?

2 个答案:

答案 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