Objective-C链式编程详解

最近看到很多关于Objective-C链式编程的文章,我还是不甚了解。有人模仿Manory写了计算器,我参考了并研究了一下,总结了Objective-C可以实现链式编程的原因和条件。

先附上Demo代码
Fruite.h

@interface Fruite : NSObject
// 在OC中,可以通过点语法调用无参方法(why?),这是OC可以实现链式编程的根本条件
- (void)func;
// 通过以下两个方法可以看出,链式编程条件:1.该Block作为无参方法的返回值 2.该Block返回值为对象实例
- (Fruite * (^) (NSString *))addFruite;            // 此方法为无参方法,可以链式调用
- (Fruite * (^) ())addFruite:(NSString *)oneFruite;// 此方法为有参函数,不能链式调用
@end

Fruite.m

#import "Fruite.h"
#define WeakFruite() __weak typeof(self) weakself = self
@interface Fruite ()
@property (nonatomic, copy) NSString *fruiteName;
@end
@implementation Fruite
#pragma mark - description
- (NSString *)description {
    return self.fruiteName;
}
#pragma mark - getters
- (NSString *)fruiteName {
    if (!_fruiteName) {
        _fruiteName = @"Apple";
    }
    
    return _fruiteName;
}
#pragma mark - chain methods
- (void)func {
    NSLog(@"this is func.");
}

// 1.使用Block作为返回值的原因,是因为Block可以直接跟(参数),这种调用类似于C语言方法调用;
// 2.Block返回值为self,保证可以链式调用
- (Fruite * (^) (NSString *))addFruite {
    WeakFruite();
    return ^ (NSString *oneFruite) {
        weakself.fruiteName = [NSString stringWithFormat:@"%@_%@", weakself.fruiteName, oneFruite];
    };
}
- (Fruite * (^) ())addFruite:(NSString *)oneFruite {
    WeakFruite();
    return ^ {
        weakself.fruiteName = [NSString stringWithFormat:@"%@_%@", weakself.fruiteName, oneFruite];
    };
}
@end

调用:

Fruite *fruite = [Fruite new];
fruite.func;
fruite.addFruite(@"Oriange").addFruite(@"Banana");
NSLog(@"%@", fruite.description);
[fruite addFruite:@"Mango"]();
NSLog(@"%@", fruite.description);

打印结果:
this is func.
Apple_Oriange_Banana
Apple_Oriange_Banana_Mango

研究了半天,总算明白了Objective-C可以实现链式编程的原因及条件,总结如下:
Objective-C可以实现链式编程的根本原因:在Objective-C中,可以通过点语法调用无参方法。
Objective-C实现链式编程的条件:1.该Block作为无参方法的返回值 2.该Block返回值为对象实例。

但是我还是没搞明白,点语法为什么可以调用无参方法呢?…

    原文作者:OC笔记
    原文地址: https://www.jianshu.com/p/81b699b28835
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞