之前看到 Masonry 是使用鏈?zhǔn)骄幊毯妫杏X很酷,自己簡單的寫了一個(gè)鏈?zhǔn)骄幊痰氖纠?/h4>
首先簡單的來說一下鏈?zhǔn)骄幊趟枷搿?br>
鏈?zhǔn)骄幊趟枷?把想要的操作封裝到block,然后給外界提供一個(gè)返回這個(gè)Block的方法。
鏈?zhǔn)骄幊趟枷氲奶攸c(diǎn):方法返回值必須是block,block參數(shù)里:放需要操作的內(nèi)容,block返回值是:方法調(diào)用者孝赫。
1.首先我創(chuàng)建了一個(gè)類 :(BYJCaculatorMaker)
#import <Foundation/Foundation.h>
@class BYJCaculatorMaker;
typedef BYJCaculatorMaker *(^caculatorBlock)(int num);
@interface BYJCaculatorMaker : NSObject
@property (nonatomic, assign) int result;
#pragma mark - 加法
- (caculatorBlock)add;
#pragma mark - 減法
- (caculatorBlock)subtract;
#pragma mark - 乘法
- (caculatorBlock)multiply;
#pragma mark - 除法
- (caculatorBlock)divide;
@end
#import "BYJCaculatorMaker.h"
@implementation BYJCaculatorMaker
#pragma mark - 加法
- (caculatorBlock)add {
return ^(int num){
_result += num;
return self;
};
}
#pragma mark - 減法
- (caculatorBlock)subtract {
return ^(int num) {
_result -= num;
return self;
};
}
#pragma mark - 乘法
- (caculatorBlock)multiply {
return ^(int num){
_result *= num;
return self;
};
}
#pragma mark - 除法
- (caculatorBlock)divide {
return ^(int num) {
_result /= num;
return self;
};
}
@end
2.我創(chuàng)建了一個(gè)分類:(NSObject+Caculator), 創(chuàng)建分類也是為了讓自己的代碼高聚合。只要是NSObject類都可以調(diào)用我的方法红符。
#import <Foundation/Foundation.h>
#import "BYJCaculatorMaker.h"
typedef void(^makerBlock)(BYJCaculatorMaker *maker);
@interface NSObject (Caculator)
// 以后計(jì)算都使用這個(gè)方法,一調(diào)用這個(gè)方法就返回結(jié)果.
+ (int)makeCaculator:(makerBlock)block;
@end
#import "NSObject+Caculator.h"
@implementation NSObject (Caculator)
+ (int)makeCaculator:(makerBlock)block {
// 創(chuàng)建計(jì)算
BYJCaculatorMaker *maker = [[BYJCaculatorMaker alloc] init];
// 計(jì)算
block(maker);
return maker.result;
}
@end
// 只需在block內(nèi)調(diào)用青柄,即可獲取結(jié)果
int result = [NSString makeCaculator:^(BYJCaculatorMaker *maker) {
maker.add(10).multiply(10).subtract(50).divide(5);
}];
NSLog(@"%d", result);
// 高聚合性
[NSString makeCaculator:^(BYJCaculatorMaker *maker) {
maker.subtract(100).divide(5).add(10).multiply(9);
}];
[UIView makeCaculator:^(BYJCaculatorMaker *maker) {
maker.subtract(100).divide(5).add(10).multiply(9);
}];