Objective-C 链式语法

最近在阅读 Masonry 源码,发现这种链式调用语法,原理很简单,可以帮助我们实现更加简洁的代码

链式语法实现示意图
图片来自谈谈 Objective-C 链式语法的实现

示例

1
2
3
4
5
6
7
8
self.str = @"测试  数 据";

// 将文本中的空格去除并打印
self.str = [self.str stringByReplacingOccurrencesOfString:@" " withString:@""];
NSLog(@"%@", [self str]);

// 对替换和打印操作进行封装,使用链式语法
self.str = self.str.replace(@" ", @"").print();

实现文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
//  NSString+Link.h

#import <Foundation/Foundation.h>

@interface NSString (Link)

- (NSString * (^)(NSString *, NSString *)) replace;
- (NSString * (^)()) print;

@end

// NSString+Link.m

#import "NSString+Link.h"

@implementation NSString (Link)

- (NSString * (^)(NSString *, NSString *))replace {
return ^id(NSString *originString, NSString *string) {
return [self stringByReplacingOccurrencesOfString:originString withString:string];
};
}

- (NSString * (^)()) print {
return ^id() {
NSLog(@"%@", self);
return self;
};
}

@end

使用链式语法后,代码更加简洁方便,但是易读性不如原本语法。

原理

我们都知道 Objective-C 是可以通过点语法调用属性的 getter 方法的。
其实,链式语法就是使用点语法调用属性的 getter 方法完成我们的需求。
并且通过定义 Block 类型的属性,我们可以实现通过()传递参数,完成我们希望的操作。
而连续访问则是通过返回要继续调用的实例实现。