【问题标题】:What does a variable defined as `Class<SomeProtocol> myClass` mean?定义为 `Class<SomeProtocol> myClass` 的变量是什么意思?
【发布时间】:2014-01-27 19:17:46
【问题描述】:

我习惯于看到id&lt;NSCopying&gt; myVarMyObject&lt;NSCopying&gt; myVar 之类的东西,我们在其中声明有问题的变量可以愉快地调用NSCopying 方法,而编译器不会抛出一个不稳定的问题。

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

Class<NSCopying> myClass;

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

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

所以我想我在问:

  1. Class&lt;NSCopying&gt; myClass; 之类的实际含义是什么
  2. Class&lt;NSCopying&gt; myClass;id&lt;NSCopying&gt; myVar 之类的内容有何不同?
  3. Class&lt;NSCopying&gt; myClass; 这样的东西可以在哪里有意义地使用?

注意事项:

  • 我只是以NSCopying 为例,并不是我的用例的组成部分
  • 无论我在哪里提到 Class,我的意思是 Obj-C 关键字 Class 用于声明类型为 Class 的变量。我没有将此作为任何类类型的通用术语。

【问题讨论】:

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


    【解决方案1】:

    我认为这可能意味着Class &lt;NSCopying&gt; myClass 指向一个实现 NSCopying 协议的类。如果协议有类方法声明并且你想调用它们,它会很有用。

    例如:

        @protocol NSSecureCoding <NSCoding>
           @required
           // The Secure Coding Guide should be consulted when writing methods that decode data.
           + (BOOL)supportsSecureCoding;
        @end
    

    【讨论】:

    • 不,Objective-C 对类对象没有类型安全性。不能表达“NSString 类型的类对象”或“符合协议 X 的类”。
    【解决方案2】:
    id <NSCopying> myVar
    

    使用id,您可以提供任何类型的类的实例(只要它实现了协议,或者您对其进行强制转换以使编译器信任您)。

    Class <NSCopying> myClass
    

    使用Class 意味着您只能提供Class,而不是实例。

    假设您希望您的应用是可配置的。假设您有许多类,它们提供了许多不同的特性,但您并不关心它们具有的继承性,只关心如何创建和配置它们。您可以使用类必须遵守的协议并提供可以注册类的方法。然后,您可以使用定义的协议实例化这些类,而无需了解该类的任何其他信息。

    【讨论】:

    • 感谢您的回复。我可能不太清楚我对Class 一词的使用 - 请参阅我的编辑以进行澄清。谢谢!
    • "你只能提供一个类,不能提供一个实例" 那么,类对象对象,即实例。
    • @newacct,尝试使用易于理解的术语。不过,欢迎提出改进描述的建议。
    【解决方案3】:

    Class&lt;ProtocolName&gt; 是指向具有符合ProtocolName 的元类的类对象的变量类型。换句话说:该类使用类方法实现ProtocolName中的方法。

    示例:NSCopying 包含一个必需的方法:

    @protocol NSCopying
    - (id)copyWithZone:(NSZone *)zone;
    @end
    

    Class&lt;NSCopying&gt;表示有方法

    + (id)copyWithZone:(NSZone *)zone;
    

    在指向的类中。对于所有NSObject 派生类都是如此,并且对于将类对象用作字典键很有用。 See the documentation.

    【讨论】:

    • @newacct 是的,当然,感谢您说清楚!元类只是通过实现协议中的方法来非正式地符合协议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-10
    相关资源
    最近更新 更多