鏈?zhǔn)骄幊?/h3>
實(shí)現(xiàn)一個類似于 Masonry 的鏈?zhǔn)骄幊蹋臃ā?/p>
第一步
我們需要一個返回值是 Int 的方法,入?yún)?yīng)該是一個匿名函數(shù)姐军,也就是Block 。
#import <Foundation/Foundation.h>
@class CaculatorMaker;
@interface NSObject (Caculator)
//計算
+ (int)makeCaculators:(block)someBlock;
@end
這樣,我們就可以實(shí)現(xiàn)這樣的結(jié)構(gòu)奕锌。
int result = [NSObject makeCaculators:^() {
}];
第二步
block 的結(jié)構(gòu)著觉。
這個 block 作為函數(shù)的參數(shù),不需要什么返回值惊暴,但是需要一個貫穿始終的類作為參數(shù)饼丘,我們定義這個類為CaculatorMaker
,block 為void (^)(CaculatorMaker *maker)
#import <Foundation/Foundation.h>
@class CaculatorMaker;
@interface NSObject (Caculator)
//計算
+ (int)makeCaculators:(void (^)(CaculatorMaker *maker))caculatorMaker;
@end
第三步
這個類需要一個整形屬性@property (assign, nonatomic) int result;
辽话。在上面函數(shù)的實(shí)現(xiàn)中肄鸽,返回這個屬性,且把這個類傳入 block 中油啤。
+ (int)makeCaculators:(void (^)(CaculatorMaker *))caculatorMaker
{
CaculatorMaker *maker = [[CaculatorMaker alloc] init];
caculatorMaker(maker);
return maker.result;
}
第四步
這個類需要加減乘除等算法典徘,這個算法必須返回之前我們定義的類才可以繼續(xù)反復(fù)調(diào)用,所以方法為
- (CaculatorMaker *)add:(int)value
{
_result += value;
return self;
}
調(diào)用為:
int result = [NSObject makeCaculators:^(CaculatorMaker *maker) {
[[[maker add:1] add:2] add:3];
}];
第五步
但是這并不是點(diǎn)語法益咬,等號右側(cè)點(diǎn)語法實(shí)際是取相關(guān) get 方法逮诲,不能有參數(shù),所以要包裝一下幽告。返回一個 block汛骂,在 block 里再返回這個類,在 block 里傳入這個 int 值评腺。
- (CaculatorMaker *(^)(int))add
{
return ^CaculatorMaker *(int value){
_result += value;
return self;
};
}
調(diào)用
int result = [NSObject makeCaculators:^(CaculatorMaker *maker) {
maker.add(1).add(2).add(3);
}];
補(bǔ)充兩點(diǎn):
CaculatorMaker 類中 result 沒設(shè)定值,所以創(chuàng)建時默認(rèn)為0淑掌,在 makeCaculators 方法中沒有重新初始化蒿讥,不斷疊加
maker.add(1) 完整寫法其實(shí)如下
CaculatorMaker *(^block) (int value) = [maker add];
block(1);
函數(shù)式編程
實(shí)現(xiàn)一個類似于 rac 的函數(shù)式編程,計算輸入數(shù)值結(jié)果抛腕,并與某數(shù)值比較是否相等芋绸。
第一步
我們需要一個類貫穿始終,擁有屬性 result 記錄當(dāng)前值担敌,isEqual 判斷是否相等摔敛,caculator 方法進(jìn)行計算。
caculate 方法需要返回一個 caculator 類全封,需要一個 block 作為參數(shù)马昙。
@property (assign, nonatomic) BOOL isEqual;
@property (assign, nonatomic) int result;
//計算
- (Caculator *)caculate:(block)caculatorBlock;
實(shí)現(xiàn)如下格式:
c = [c caculate:^(block)) {
}];
第二步
分析 block 的內(nèi)容,需要一個 int 入?yún)⒆鳛槌跏贾瞪层玻粋€ int 出參作為運(yùn)算結(jié)果行楞。
- (Caculator *)caculate:(int(^)(int result))caculatorBlock
{
_result = caculatorBlock(_result);
return self;
}
邏輯可以放到 block 里直接進(jìn)行。
c = [c caculate:^int(int result) {
result += 2;
result *= 5;
return result;
}];
第三步
后續(xù)邏輯類似
- (Caculator *)equal:(BOOL (^)(int))operationBlock
{
_isEqual = operationBlock(_result);
return self;
}
使用
Caculator *c = [[Caculator alloc] init];
c = [[c caculate:^int(int result) {
result += 2;
result *= 5;
return result;
}] equal:^BOOL(int result) {
return result == 10;
}];
第四步
獲取類中屬性土匀。
BOOL result = [[[c caculate:^int(int result) {
result += 3;
result *= 4;
return result;
}] equal:^BOOL(int result) {
return result == 12;
}] isEqual];
響應(yīng)式編程的概念
在網(wǎng)上流傳一個非常經(jīng)典的解釋`響應(yīng)式編程的概念`
在程序開發(fā)中:
a = b + c
賦值之后 b 或者 c 的值變化后子房,a 的值不會跟著變化
響應(yīng)式編程,目標(biāo)就是,如果 b 或者 c 的數(shù)值發(fā)生變化证杭,a 的數(shù)值會同時發(fā)生變化田度;