如何指定返回符合Objective-C协议的Class类型的方法返回值?
Objective-C中返回符合类方法协议的Class的类型指定方案
给定仅包含类方法的Objective-C协议声明:
@protocol TDWMethoding<NSObject> + (void)foo; + (void)bar; @end
需要实现一个方法返回符合该协议的Class对象,原方法框架如下:
- (nullable /*return-type*/)instantiateMethoding { Class instance = ... // some implementation if ([instance conformsToProtocol:@protocol(TDWMethoding)]) { return instance; } return nil; }
最优返回类型:Class<TDWMethoding>
这是Objective-C语法中专门用来表示类对象本身遵循指定协议的写法,完全贴合需求:
- 编译器会识别该类型,对后续调用类方法(如
foo、bar)做类型检查,避免调用不存在的方法; - 语义清晰,和表示「实例遵循协议」的
id<TDWMethoding>或Type<Protocol>*明确区分,不会造成混淆。
修改后的方法声明如下:
- (nullable Class<TDWMethoding>)instantiateMethoding { Class instance = ... // some implementation if ([instance conformsToProtocol:@protocol(TDWMethoding)]) { return instance; } return nil; }
对三种备选方案的弊端分析
Class:类型过于宽泛,无法体现该类遵循TDWMethoding协议的特性,调用方无法直接通过编译器感知类方法的存在,容易引发运行时错误。id<TDWMethoding>:语义错误,该类型表示的是遵循协议的实例对象,而非类本身;若用此类型,还需额外实例化类,既冗余又与需求(返回Class)相悖,同时无法隐藏工具类的构造方法。Class<TDWMethoding>(曾担心语义混淆):实际上这是Objective-C官方认可的语法,和实例层面的协议标注语义完全分离——实例标注Type<Protocol>*指实例遵循协议,而Class<Protocol>明确指类对象本身遵循协议,不存在歧义。
内容的提问来源于stack exchange,提问作者Aleksandr Medvedev
相关产品推荐
相关产品推荐

