objective-c - ObjC 类对象可以符合协议(protocol)吗?

标签 objective-c class syntax protocols

有没有办法向编译器表明类对象符合协议(protocol)?

据我所知,通过创建 +(void)foo 类方法,该类对象的实例 会将这些方法作为实例方法。因此,只要我为所有必需的协议(protocol)方法创建 +(void)foo 方法,我就可以让一个类对象充当委托(delegate)。

我的问题当然是在类的头文件中,我只知道如何指示类的实例符合协议(protocol)(通常情况下就是这样)。所以,我想出的最好办法是像这样转换类对象:

something.delegate = (id<SomethingDelegate>)[self class]

有什么想法吗?

相关但不同的: ObjC: is there such a thing as a "class protocol"?

最佳答案

您现在所做的是正确的,因为它会消除警告,这是您的目标。您将发送协议(protocol)中为实例定义的类对象消息,这有点令人困惑,但运行时并不关心。

这样想:您想将委托(delegate)设置为响应协议(protocol)中定义的消息的对象。你的类就是这样做的,你的类也是一个对象。因此,您应该将您的类视为符合该协议(protocol)的对象。因此,您所写的内容是完全正确的(基于您正在尝试做的事情)。

不过,需要注意的一点是,此类不会正确响应 conformsToProtocol:。无论如何,这对于委托(delegate)设置来说通常是可以的(委托(delegate)通常不检查类是否符合——它们只检查它是否可以响应选择器)。

作为旁注,您可以在句法上做的一件事是:

Class<SomethingDelegate> variable = (Class<SomethingDelegate>)[self class];

这里的区别在于编译器将使用协议(protocol)中的类方法而不是实例消息。不过,这不是您想要的。

关于objective-c - ObjC 类对象可以符合协议(protocol)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10068434/

相关文章:

c - 什么是 C 中的完整声明符?

ios - 当我通过 uisearchbar "click"时推送 View Controller

iphone - 返回从 block 内部设置的 NSString

java - python 文件应该总是包含一个类吗?

php - OOP(php)在另一个类中实例化类

haskell - Haskell 中的函数保护语法

ios - 首次启动时从 iOS 应用程序中的转储文件创建数据库

iphone - NSPredicate 格式等同于 SQL 查询

java - Testng - 使用 setTestClasses() 传递参数

javascript - 如何调用 javascript 函数并从 XAML/Silverlight 传递值?