变量定义为`Class <someprotocol> myClass`是什么意思?</someprotocol>

时间:2014-01-09 09:56:31

标签: objective-c class variable-declaration objective-c-protocol

我习惯于看到id<NSCopying> myVarMyObject<NSCopying> myVar这样的内容,我们在这里说明有问题的变量可以很快地调用NSCopying方法,而编译器不会摇摆不定。

但我最近发现了一些定义了这样的变量的代码:

Class<NSCopying> myClass;

我想知道这实际意味着什么,因为它似乎与前两个例子略有不同。我们似乎在说变量myClass可以愉快地接受来自NSCopying的方法调用 - 但是类类型能够接受这些实例变量方法似乎没有多大意义。

我发现类型的变量在技术上是对象本身,这可能让我或编译器(可能是我!)感到困惑。

所以我猜我在问:

  1. Class<NSCopying> myClass;之类的内容实际上是什么意思
  2. Class<NSCopying> myClass;id<NSCopying> myVar
  3. 之类的内容有何不同
  4. 哪些地方可以使用Class<NSCopying> myClass;?{/ li>

    注意:

    • 我只是以NSCopying为例,并不是我的用例不可或缺的
    • 无论我在何处引用Class,我的意思是Obj-C关键字Class,用于声明Class类型的变量。我不是将它用作任何类类型的通用术语。

3 个答案:

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