在 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/