iOS中的链式编程

Featured image

链式编程

提到链式编程,在Objective-C中最典型的代表就是Masonry了,比较完美的实现了函数式和链式编程。 链式编程一般就是将多个操作(多行代码)通过点号(.)链接在一起成为一句代码,使代码可读性好。a(1).b(2).c(3)

特点:方法的返回值是block,block必须有返回值(本身对象),block参数(需要操作的值)

例子

我们想要调用一个类对象中的两个方法,正常的实现方式是: Objective-C:

NormalClass.h

#import <Foundation/Foundation.h>

@interface NormalClass : NSObject

- (void)fun1: (NSString *)param;
- (void)fun2: (NSString *)param;

@end

NormalClass.m

#import "NormalClass.h"

@implementation NormalClass

- (void)fun1: (NSString *)param {
    NSLog(@"normal fun1: %@", param);
}

- (void)fun2: (NSString *)param {
    NSLog(@"normal fun2: %@", param);
}

@end

调用如下:

NormalClass *normal = [NormalClass new];
[normal fun1: @"param1"];
[normal fun2: @"param2"];

正常输出:

normal fun1: param1
normal fun2: param2

如果要用链式来实现呢,可以这样写:

ChainClass.h

#import <Foundation/Foundation.h>

@interface ChainClass : NSObject

@property (copy, nonatomic) void (^actionBlock)(NSString *param);

- (ChainClass * (^)(NSString *param))fun1;
- (ChainClass * (^)(NSString *param))fun2;
    
@end

ChainClass.m

#import "ChainClass.h"

@implementation ChainClass

- (ChainClass * (^)(NSString *param))fun1 {
    return ^(NSString *param) {
        NSLog(@"chain fun1: %@", param);
        return self;
    };
}

- (ChainClass * (^)(NSString *param))fun2 {
    return ^(NSString *param) {
        NSLog(@"chain fun2: %@", param);
        return self;
    };
}

@end

调用如下:

ChainClass *chain = [ChainClass new];
chain.fun1(@"param1").fun2(@"param2");

正常输出:

chain fun1: param1
chain fun2: param2

链式调用在Swift里实现起来就简单很多, 如下 Swift:

import Foundation

class ChainClass: NSObject {
    var fun1 : (String) -> ChainClass {
        return {
            NSLog("chain fun1: %@", $0)
            return self
        }
    }

    var fun2 : (String) -> ChainClass {
        return {
            NSLog("chain fun2: %@", $0)
            return self
        }
    }
}

调用如下:

ChainClass().fun1("param1").fun2("param2")

正常输出:

chain fun1: param1
chain fun2: param2