objective-c - 在 Objective-C 中定义协议(protocol)的类别?

在 Objective-C 中,我可以将方法添加到具有类别的现有类中,例如

@interface NSString (MyCategory)
- (BOOL) startsWith: (NSString*) prefix;
@end

是否也可以使用协议(protocol)来执行此操作,即如果有 NSString 协议(protocol),例如:

@interface <NSString> (MyCategory)
- (BOOL) startsWith: (NSString*) prefix;
@end

我想这样做,因为我对 NSObject(类)有几个扩展,只使用公共(public) NSObject 方法,并且我希望这些扩展也可以与实现协议(protocol)的对象一起使用。

再举一个例子,如果我想写一个方法 logDescription 来打印一个对象的描述到日志:

- (void) logDescription {
    NSLog(@"%@", [self description]);
}

我当然可以将这个方法添加到 NSObject,但是还有其他类不继承自 NSObject,我也希望有这个方法,例如NS代理。由于该方法仅使用协议(protocol)的公共(public)成员,因此最好将其添加到协议(protocol)中。

编辑:Java 8 现在在接口(interface)中有“虚拟扩展方法”:http://cr.openjdk.java.net/~briangoetz/lambda/Defender%20Methods%20v4.pdf .这正是我想在 Objective-C 中做的事情。我没有看到这个问题引起如此多的关注......

问候, 乔辰

最佳答案

简短回答:不。

长答案:这将如何工作?想象一下您可以向现有协议(protocol)添加方法吗?这将如何工作?假设我们想在 NSCoding 中添加另一个方法,比如 -(NSArray *)codingKeys; 这个方法是一个必需的方法,它返回一个用于编码对象的键数组。

问题在于现有的类(比如 NSString)已经实现了 NSCoding,但没有实现我们的 codingKeys 方法。应该发生什么?当这个 required 消息被发送到一个没有实现它的类时,预编译的框架如何知道该怎么做?

您可以说“我们可以通过类别添加此方法的定义”或“我们可以说通过这些协议(protocol)类别添加的任何方法都是显式可选的”。是的,您可以这样做并从理论上解决我上面描述的问题。但是,如果您要这样做,您不妨先将其设为一个类别,然后在调用该方法之前检查以确保类 respondsToSelector:

https://stackoverflow.com/questions/1521267/

相关文章:

ios - 带有 AVPlayer 的多个视频

iphone - 如何以编程方式创建 UIScrollView?

iphone - Objective-C - 将 float 转换为字符串的其他方法

ios - 切换隐私设置将杀死应用程序

ios - 如何在 iOS 中使用 'Container View'?

iphone - NSDateFormatter,我做错了什么还是这是一个错误?

objective-c - 为什么不鼓励使用伞式框架?

objective-c - 处理由于 iOS 通讯录 API 中的链接卡导致的重复联系人

iphone - Objective-C 中的实例变量是否默认设置为 nil?

ios - swift 中的@property/@synthesize 等价物