gunavy
V2EX  ›  iDev

为 Objective-C 写了框架,虽然已经 49 年了!

By gunavy at 2019 年 12 月 16 日 · 16273 次点击

为 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);

项目地址:

类似项目:

第 1 条附言  ·  2019 年 12 月 16 日

@lzihua

一个示例

示例 ProtocolNetworkObjc 是基于 NNPopObjc 对 ProtocolNetwork 完全复刻的 Objective-C 版本。

ProtocolNetwork 是 喵神王巍 在 MDCC 16 (移动开发者大会) iOS 专场《面向协议编程与 Cocoa 的邂逅》主题演讲时使用的 Demo 工程,Demo 演示了 Swift 面向协议编程在 Cocoa 中的使用,ProtocolNetworkObjc 的代码及分析可参考:面向协议编程与 Cocoa 的邂逅 (下) 。

9 条回复  •  2019-12-19 12:19:59 +08:00
xiangyuecn
   1
xiangyuecn  
   2019 年 12 月 16 日
oc 的代码风格看起来真像命令行的代码一样凌乱,这一丢丢那一丢丢😂
optional
   2
optional  
   2019 年 12 月 16 日   ❤️ 1
我发现你贴的代码 @到我了。。 @optional
gunavy
   3
gunavy  
OP
   2019 年 12 月 16 日
@xiangyuecn 过于风骚😂
gunavy
   4
gunavy  
OP
   2019 年 12 月 16 日
nutting
   5
nutting  
   2019 年 12 月 16 日
搭车出 oc 教程,蓝色的那本书,正版,都没怎么看
lzihua
   6
lzihua  
   2019 年 12 月 16 日
楼主可以出个 demo example 讲下某个 Case 下常规做法 用 Protocol 做法 用了 NNPopObjc 做法 有个对比 可以直观体现
wangyzj
   7
wangyzj  
   2019 年 12 月 16 日
@optional 哈哈哈哈
wangkun2012324
   8
wangkun2012324  
   2019 年 12 月 18 日
why not switch to Swift
gunavy
   9
gunavy  
OP
   2019 年 12 月 19 日 via iPhone
@wangkun2012324 到了项目用什么不是一个人的事,Swift 我也用
iOS 开发实用技术导航
NSHipster 中文版
› http://nshipster.cn/
cocos2d 开源 2D 游戏引擎
› http://www.cocos2d-iphone.org/
CocoaPods
› http://cocoapods.org/
Google Analytics for Mobile 统计解决方案
› http://code.google.com/mobile/analytics/
WWDC
› https://developer.apple.com/wwdc/
Design Guides and Resources
› https://developer.apple.com/design/
Transcripts of WWDC sessions
› http://asciiwwdc.com
Cocoa with Love
› http://cocoawithlove.com/
Cocoa Dev Central
› http://cocoadevcentral.com/
NSHipster
› http://nshipster.com/
Style Guides
› Google Objective-C Style Guide
› NYTimes Objective-C Style Guide
Useful Tools and Services
› Charles Web Debugging Proxy
› Smore
© 2026 V2EX · 38ms · 3.9.8.5