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

2019-12-16 10:20:16 +08:00
 gunavy

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

项目地址:

类似项目:

15069 次点击
所在节点    iDev
9 条回复
xiangyuecn
2019-12-16 10:25:47 +08:00
oc 的代码风格看起来真像命令行的代码一样凌乱,这一丢丢那一丢丢😂
optional
2019-12-16 10:29:16 +08:00
我发现你贴的代码 @到我了。。 @optional
gunavy
2019-12-16 10:34:27 +08:00
@xiangyuecn 过于风骚😂
gunavy
2019-12-16 10:34:34 +08:00
nutting
2019-12-16 10:37:05 +08:00
搭车出 oc 教程,蓝色的那本书,正版,都没怎么看
lzihua
2019-12-16 11:04:50 +08:00
楼主可以出个 demo example 讲下某个 Case 下常规做法 用 Protocol 做法 用了 NNPopObjc 做法 有个对比 可以直观体现
wangyzj
2019-12-16 11:27:07 +08:00
@optional 哈哈哈哈
wangkun2012324
2019-12-18 11:01:28 +08:00
why not switch to Swift
gunavy
2019-12-19 12:19:59 +08:00
@wangkun2012324 到了项目用什么不是一个人的事,Swift 我也用

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/629366

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX