我习惯于看到id<NSCopying> myVar
或MyObject<NSCopying> myVar
这样的内容,我们在这里说明有问题的变量可以很快地调用NSCopying
方法,而编译器不会摇摆不定。
但我最近发现了一些定义了这样的变量的代码:
Class<NSCopying> myClass;
我想知道这实际意味着什么,因为它似乎与前两个例子略有不同。我们似乎在说变量myClass
可以愉快地接受来自NSCopying
的方法调用 - 但是类类型能够接受这些实例变量方法似乎没有多大意义。
我发现类型的变量在技术上是对象本身,这可能让我或编译器(可能是我!)感到困惑。
所以我猜我在问:
Class<NSCopying> myClass;
之类的内容实际上是什么意思Class<NSCopying> myClass;
与id<NSCopying> myVar
Class<NSCopying> myClass;
?{/ li>
醇>
注意:
NSCopying
为例,并不是我的用例不可或缺的Class
,我的意思是Obj-C关键字Class
,用于声明Class
类型的变量。我不是将它用作任何类类型的通用术语。答案 0 :(得分:0)
id <NSCopying> myVar
使用id
,您可以提供任何类型的实例(只要它实现协议,或者您将其转换为使编译器信任您)。
Class <NSCopying> myClass
使用Class
表示您只能提供Class
,而不是实例。
假设您希望自己的应用可配置。假设您有许多类提供了许多不同的功能,但您并不关心它们的继承,只关注如何创建和配置它们。您可以使用该类必须符合的协议,并提供可以注册类的方法。然后,您可以使用已定义的协议实例化这些类,而无需了解有关该类的任何其他内容。
答案 1 :(得分:0)
我认为这可能意味着Class <NSCopying> myClass
指向实现NSCopying协议的类。如果protocol具有类方法声明并且您想要调用它们,那么它将非常有用。
例如:
@protocol NSSecureCoding <NSCoding>
@required
// The Secure Coding Guide should be consulted when writing methods that decode data.
+ (BOOL)supportsSecureCoding;
@end
答案 2 :(得分:0)
Class<ProtocolName>
是指向具有符合ProtocolName
元类的类对象的变量的类型。换句话说:该类使用类方法从ProtocolName
实现方法。
示例:NSCopying
包含一个必需的方法:
@protocol NSCopying
- (id)copyWithZone:(NSZone *)zone;
@end
Class<NSCopying>
表示有方法
+ (id)copyWithZone:(NSZone *)zone;
在被指向的类中。对于所有NSObject
派生类都是如此,对于将类对象用作字典键非常有用。 See the documentation