
为 Objective-C 的 Protocol 增加扩展,达到 Objective-C 的 POP 编程效果。
/// 声明协议
@protocol NNCodeProtocol <NSObject> @optional + (void)sayHelloPop; - (void)sayHelloPop; @end @protocol NNCodeWhoProtocol <NNCodeProtocol> @optional @property (nonatomic, strong) NSString* who; @end /// 对 NNCodeWhoProtocol 协议实现扩展
@nn_extension(NNCodeWhoProtocol, @nn_where(self == [NNCodeObjc class]), NNCodeNameProtocol) + (void)sayHelloPop { DLog(@"+[%@ %s] objc says hello pop", self, sel_getName(_cmd)); } - (void)sayHelloPop { DLog(@"-[%@ %s] objc says hello pop", [self class], sel_getName(_cmd)); } - (NSString *)who { NSString *who = [NSString stringWithFormat:@"-[%@ %s] objc says I am %@", [self class], sel_getName(_cmd), self.name]; return who; } - (void)setWho:(NSString *)who { @nn_exscope(self) { @nn_inscope(NNCodeObjc *, self) self.name = who; } } @end ///声明 NNCodeObjc 类,并遵守 NNCodeWhoProtocol 协议,获取 NNCodeWhoProtocol 协议扩展实现方法
@protocol NNCodeNameProtocol <NSObject> @optional @property (nonatomic, strong) NSString* name; @end @interface NNCodeObjc : NSObject <NNCodeWhoProtocol, NNCodeNameProtocol> @property (nonatomic, strong) NSString *name; @end @implementation NNCodeObjc @end ///调用
[NNCodeObjc sayHelloPop]; NNCodeObjc *objc = [NNCodeObjc new]; [objc sayHelloPop]; objc.who = @"objc"; DLog(@"%@", objc.who); 项目地址:
类似项目:
示例 ProtocolNetworkObjc 是基于 NNPopObjc 对 ProtocolNetwork 完全复刻的 Objective-C 版本。
ProtocolNetwork 是 喵神王巍 在 MDCC 16 (移动开发者大会) iOS 专场《面向协议编程与 Cocoa 的邂逅》主题演讲时使用的 Demo 工程,Demo 演示了 Swift 面向协议编程在 Cocoa 中的使用,ProtocolNetworkObjc 的代码及分析可参考:面向协议编程与 Cocoa 的邂逅 (下) 。
1 xiangyuecn 2019-12-16 10:25:47 +08:00 oc 的代码风格看起来真像命令行的代码一样凌乱,这一丢丢那一丢丢 |
3 gunavy OP @xiangyuecn 过于风骚 |
5 nutting 2019-12-16 10:37:05 +08:00 搭车出 oc 教程,蓝色的那本书,正版,都没怎么看 |
6 lzihua 2019-12-16 11:04:50 +08:00 楼主可以出个 demo example 讲下某个 Case 下常规做法 用 Protocol 做法 用了 NNPopObjc 做法 有个对比 可以直观体现 |
8 wangkun2012324 2019-12-18 11:01:28 +08:00 why not switch to Swift |
9 gunavy OP @wangkun2012324 到了项目用什么不是一个人的事,Swift 我也用 |