在 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
.
对于其他 类 您可以子类化的协议,您可以在子类中实现该协议。
通常在将变量声明为协议时,它是这样完成的:
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
.
对于其他 类 您可以子类化的协议,您可以在子类中实现该协议。