模仿Masonry連續運用點語法的操做git
[self.view mas_makeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(@10).offset(1); }];
寫出一個連加的操做github
make.add(10).add(10);
SQMath.h面試
#import <Foundation/Foundation.h> @interface SQMath : NSObject - (NSInteger)result; - (void)add:(int)number; @end
SQMath.m編程
#import "SQMath.h" @interface SQMath () @property (nonatomic, assign) NSInteger number; @end @implementation SQMath - (NSInteger)result { return self.number; } - (void)add:(int)number { self.number += number; } @end
使用這個SQMath的add方法函數
SQMath *math = [[SQMath alloc] init]; [math add:10]; [math add:20]; NSLog(@"%ld", [math result]);
若是要用點語法,須要讓-add從一個方法變成一個add的屬性。可是這樣就沒有辦法傳參了atom
- (NSInteger)add;
可是若是返回值是一個 NSInteger (^)(NSInteger) 類型的block就能夠了。math.add返回的是這個block,這個block是須要一個NSInteger爲參數(加數),返回值是NSInteger(結果)。code
SQMath.m對象
- (NSInteger (^)(NSInteger count))add { __weak typeof(self) weakSelf=self; NSInteger (^addBlock)(NSInteger) = ^(NSInteger addCount){ __strong typeof(weakSelf) strongSelf = weakSelf; strongSelf.number += addCount; return strongSelf.number; }; return addBlock; }
或者get
- (NSInteger (^)(NSInteger count))add { __weak typeof(self) weakSelf=self; return ^(NSInteger addCount) { __strong typeof(weakSelf) strongSelf = weakSelf; strongSelf.number += addCount; return strongSelf.number; }; }
使用這個SQMath的add方法it
SQMath *math = [[SQMath alloc] init]; NSLog(@"%ld", math.add(10)); NSLog(@"%ld", math.add(20)); NSLog(@"%ld", math.add(30));
只要將Block的返回值更改成self。這樣每次add返回的則變成了SQMath的實例對象,這樣就能夠實現連續點語法的效果了。
- (SQMath* (^)(NSInteger count))add { __weak typeof(self) weakSelf=self; return ^(NSInteger addCount) { __strong typeof(weakSelf) strongSelf = weakSelf; strongSelf.number += addCount; return self; }; }
使用這個SQMath的add方法
SQMath *math = [[SQMath alloc] init]; NSLog(@"%ld", math.add(10).add(20).add(30).result) ;
NSNumber+SQMath.h
#import <Foundation/Foundation.h> #import "SQMath.h" @interface NSNumber (Math) - (NSInteger)sq_add:(void(^)(SQMath *make))block; @end
NSNumber+SQMath.m
#import "NSNumber+SQMath.h" @implementation NSNumber (SQMath) - (NSInteger)sq_add:(void(^)(SQMath *))block { SQMath *math = [[SQMath alloc] init]; block(math); return math.result; } @end
NSNumber+SQMath 使用
NSInteger result = [@10 sq_add:^(SQMath * make) { make.add(10).add(20); }]; NSLog(@"%ld", result);
ps:鏈式編程何時用我還真不太清楚,但我知道面試的時候確定有用 哈哈。