Reactive Cocoa详解(1)----神奇的RAC宏
(一)神奇的Macros
先说说RAC中必须要知道的宏
探究一下,关键的关键是如下一个宏:
- RAC(TARGET, [KEYPATH, [NIL_VALUE]])
- RAC(self.outputLabel, text) = self.inputTextField.rac_textSignal;
- RAC(self.outputLabel, text, @"收到nil时就显示我") = self.inputTextField.rac_textSignal;
- [TARGET setValue:value ?: NIL_VALUE forKeyPath:KEYPATH];
- RACObserve(TARGET, KEYPATH)
- RAC(self.outputLabel, text) = RACObserve(self.model, name);
- @weakify(Obj);
- @strongify(Obj);
- @weakify(self); // 定义了一个__weak的self_weak_变量
- [RACObserve(self, name) subscribeNext:^(NSString *name) {
- @strongify(self); // 局域定义了一个__strong的self指针指向self_weak
- self.outputLabel.text = name;
- }];
- #define metamacro_argcount(...)
- metamacro_at(20, __VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)
- int count = metamacro_argcount(a, b, c);
- int count = metamacro_at(20, a, b, c, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)
- #define metamacro_at(N, ...) metamacro_concat(metamacro_at, N)(__VA_ARGS__)
- // 下面是metamacro_concat做的事(简写一层)
- #define metamacro_concat_(A, B) A ## B
- int count = metamacro_at20(a, b, c, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1);
- #define metamacro_at20(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, ...) metamacro_head(__VA_ARGS__)
- int count = metamacro_head(3, 2, 1);
- #define metamacro_head(...) metamacro_head_(__VA_ARGS__, 0)
- #define metamacro_head_(FIRST, ...) FIRST
- int count = 3;

- #define keypath(...)
- metamacro_if_eq(1, metamacro_argcount(__VA_ARGS__))(keypath1(__VA_ARGS__))(keypath2(__VA_ARGS__))
- #define keypath2(OBJ, PATH)
- (((void)(NO && ((void)OBJ.PATH, NO)), # PATH))
- #define keypath2(OBJ, PATH) (???????, # PATH)
- int a = 0, b = 0;
- a = 1, b = 2;
- int c = (a, b);
- int c = ((void)a, b);
- (((void)(NO && ((void)OBJ.PATH, NO)), # PATH))
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
- 上一篇: __block,访问block外局部变量
- 下一篇:没有了