Ios 用“”括起来的变量

Ios 用“”括起来的变量,ios,objective-c,Ios,Objective C,在Google Analytics iOS中,有以下行: id<GAITracker> tracker = [[GAI sharedInstance] defaultTracker]; 为什么GAITracker变量包含在中?有什么想法吗?这意味着您有一个id类型为Any object的变量,但只有符合GAITracker协议的变量 一般语法如下: type<protocol1,protocol2> varname 这指定了一个类型为的变量,该变量只能在括号之间保存符

在Google Analytics iOS中,有以下行:

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

为什么GAITracker变量包含在中?有什么想法吗?

这意味着您有一个id类型为Any object的变量,但只有符合GAITracker协议的变量

一般语法如下:

type<protocol1,protocol2> varname

这指定了一个类型为的变量,该变量只能在括号之间保存符合列表中所有协议的对象。

Linuxios解释了语法的含义。我会尽力解释为什么

当您编写@协议时,您定义了许多必需的和可选的方法,符合该协议的对象可以实现这些方法

假设我有一个如下所示的@协议:

@Protocol FooProtocol
@required
- (void)doStuff;
@End
所以现在,所有符合的东西都必须实现一个名为doStuff的方法

因此,如果我这样做:

NSObject *bar = [[Bar alloc] init];
如果我尝试这样做:

[bar doStuff];
Xcode将告诉我NSObject没有可见的选择器doStuff

但是,如果我将代码更改为:

NSObject<FooProtocol> *bar = [[Bar alloc] init];
因为尽管NSObject仍然没有可见的选择器doStuff,但我实现的FooProtocol确实有一个名为doStuff的选择器,bar不仅仅是一个NSObject,更确切地说,它是一个符合FooProtocol的NSObject

现在,在这个解释中,这是一个有点愚蠢的案例。但是,当您希望UIViewController充当TextFieldDelegate时,它尤其有用。常规UIViewController无法执行此操作

但是,UIViewController可以执行此任务,因为它不仅是UIViewController,而且是符合TextFieldDelegate协议的UIViewController

[bar doStuff];