【发布时间】:2023-01-19 02:54:53
【问题描述】:
考虑以下 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;
}
有许多在职的到目前为止,我考虑过关于如何表达 /*return-type*/ 的选项,但每个选项都有其自身的缺点:
-
Class- 这样它就不会暴露一致性。这是什么Class?它有什么作用?它完全符合协议吗? -
Class<TDWMethoding>- 这看起来是一个可行的解决方案,甚至被其他开发人员(here 和here)建议过几次,但我个人认为它不一致且具有误导性:当我们有一个形式为Type<Protocol> *instance的变量时,它通常意味着协议类方法应该发送到实例的类([[instance class] foo])而不是实例本身([instance foo]); -
id<TDWMethoding>并返回一个类的实例 - 这是一致的,但它需要我实例化该类,这既多余又阻止我隐藏符合NS_UNAVAILABLE宏协议的实用程序类的构造函数.是否有更好的语义来表达这种返回类型?
【问题讨论】:
标签: objective-c introspection contract objective-c-protocol