在 Objective-C 的变量声明中使用 TypeName<protocol_name>

Use of TypeName<protocol_name> in variable declaration in Objective-C

通常在将变量声明为协议时,它是这样完成的:

id<protocol_name> variable;

但是最近我看到了一些我不完全理解的东西。编译器允许您定义如下内容:

NSString<protocol_name> *variable;

事实上,从其他 "plain" NSString 变量赋值会导致编译器警告您,您需要转换它。

我在 JSONModel 中看到过它,框架将它用于 "annotate" 属性。

但是,除此之外它还有什么用呢?有什么好处?

谢谢。

使用 variable 的好处是您可以像使用 NSString*id<protocol_name> 一样工作。 您可能需要所有接口而不需要类型转换。

"plain" NSString 不符合协议 "protocol_name" 并且编译器不允许这样做。

但是你可以让 NSString 符合类别协议:

@interface NSString(protocol_name) < protocol_name >
@end

实际上 NSString<protocol_name> 是不好的例子,因为你不能继承 NSString.

对于其他 类 您可以子类化的协议,您可以在子类中实现该协议。