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

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

是否也可以通过协议实现这一点,例如,如果有NSString协议,比如:

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

我之所以想这样做,是因为我对NSObject(类)有几个扩展,只使用公共NSObject方法,我希望这些扩展也能与实现协议的对象一起工作.

再举一个例子,如果我想编写一个方法logDescription,将对象的描述打印到日志(log)中,该怎么办

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

我当然可以将这个方法添加到NSObject,但是还有其他类不是从NSObject继承的,我也希望有这个方法,例如NSProxy.因为它只使用公共协议的成员.

编辑:Java8现在在接口http://cr.openjdk.java.net/~briangoetz/lambda/Defender%20Methods%20v4.pdf中有了"虚拟扩展方法".这正是我希望在Objective-C中所做的.我没有看到这个问题得到如此多的关注...

当做

推荐答案

extObjC has the NEATEST stuff你可以使用协议/类别...首先是@concreteprotocol...

  • 定义一个"具体协议",它可以提供协议中方法的默认实现.
  • 头文件中应存在@protocol块,实现文件中应存在相应的@concreteprotocol块.
  • 任何声明自己符合此协议的对象都将接收其方法实现,但前提是不存在同名的方法.

MyProtocol.h

@protocol MyProtocol 
@required - (void)someRequiredMethod;
@optional - (void)someOptionalMethod;
@concrete - (BOOL)isConcrete;   

MyProtocol.m

 @concreteprotocol(MyProtocol) - (BOOL)isConcrete { return YES; } ...

因此,声明一个对象MyDumbObject : NSObject <MyProtocol>将自动返回YESisConcrete.

此外,它们还有pcategoryinterface(PROTOCOL,CATEGORY)个"定义了协议上名为category的类别的接口".协议类别包含自动应用于任何声明自己符合协议的类的方法."在您的实现文件中还必须使用附带的宏.请参阅文档.

最后,但并非最不重要/与@protocols相关的directly

这个库中的So many个工具打开了你可以用ObjC做的事情...多重继承...好吧,你的想象力是极限.

Objective-c相关问答推荐

将 NSInteger 转换为 NSIndexpath

如何使用第一个字符作为部分名称

iPhone 可达性判断

KVO - 如何判断对象是否是观察者?

'if not' 的 Objective-C 预处理器指令

UIGestureRecognizer 是否适用于 UIWebView?

带有语法高亮的 UITextView

CABasicAnimation 无 HUGE_VALF 无限重复?

混合 Objective-C 和 C++

Objective-C 中的 const 与静态 NSStrings

字符串的静态 NSArray - 如何/在哪里初始化视图控制器

UITableView configureCellForDisplay:forIndexPath 中的断言失败:

Objective-C:块 vs. Select 器 vs. 协议

如何使用 iOS 创建一个大的红色 UIButton?

在 32 位和 64 位架构上格式化 NS(U)Integer 时类型转换的替代方法?

如何在 UIAlertController 中添加 textField?

如何在键盘上添加完成按钮?

iPhone SDK:如何在视图中播放视频?而不是全屏

Xcode没有编译任何项目? 'clang 失败,退出代码 255'

在 iOS 8 中使用 NSMutableAttributedString 的字符串的下划线部分不起作用