最近在阅读 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
|
#import <Foundation/Foundation.h>
@interface NSString (Link)
- (NSString * (^)(NSString *, NSString *)) replace; - (NSString * (^)()) print;
@end
#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 类型的属性,我们可以实现通过()传递参数,完成我们希望的操作。
而连续访问则是通过返回要继续调用的实例实现。