V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
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
gunavy
V2EX  ›  iDev

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

  •  
  •   gunavy · 2019-12-16 10:20:16 +08:00 · 14840 次点击
    这是一个创建于 1564 天前的主题,其中的信息可能已经有所发展或是发生改变。

    为 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 22:20:15 +08:00

    @lzihua

    一个示例

    示例 ProtocolNetworkObjc 是基于 NNPopObjcProtocolNetwork 完全复刻的 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 10:25:47 +08:00
    oc 的代码风格看起来真像命令行的代码一样凌乱,这一丢丢那一丢丢😂
    optional
        2
    optional  
       2019-12-16 10:29:16 +08:00   ❤️ 1
    我发现你贴的代码 @到我了。。 @optional
    gunavy
        3
    gunavy  
    OP
       2019-12-16 10:34:27 +08:00
    @xiangyuecn 过于风骚😂
    gunavy
        4
    gunavy  
    OP
       2019-12-16 10:34:34 +08:00
    nutting
        5
    nutting  
       2019-12-16 10:37:05 +08:00
    搭车出 oc 教程,蓝色的那本书,正版,都没怎么看
    lzihua
        6
    lzihua  
       2019-12-16 11:04:50 +08:00
    楼主可以出个 demo example 讲下某个 Case 下常规做法 用 Protocol 做法 用了 NNPopObjc 做法 有个对比 可以直观体现
    wangyzj
        7
    wangyzj  
       2019-12-16 11:27:07 +08:00
    @optional 哈哈哈哈
    wangkun2012324
        8
    wangkun2012324  
       2019-12-18 11:01:28 +08:00
    why not switch to Swift
    gunavy
        9
    gunavy  
    OP
       2019-12-19 12:19:59 +08:00 via iPhone
    @wangkun2012324 到了项目用什么不是一个人的事,Swift 我也用
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1140 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 18:33 · PVG 02:33 · LAX 11:33 · JFK 14:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.