函數(shù)式編程
編程思想
:把過程盡量寫成一系列嵌套的函數(shù)。(函數(shù)式編程更加強(qiáng)調(diào)程序執(zhí)行的結(jié)果而非執(zhí)行的過程谢翎,函數(shù)式編程中的函數(shù)指的并不是編程語(yǔ)言中的函數(shù)(或方法),它指的是數(shù)學(xué)意義上的函數(shù)沐旨,即映射關(guān)系)
函數(shù)式編程特點(diǎn)
:
1.可以把函數(shù)作為參數(shù)進(jìn)行傳遞(在OC中就是將block作為方法參數(shù)傳遞)
2.可以將函數(shù)作為返回值(在OC中就是將block作為方法返回值)
使用函數(shù)式編程的例子就太多了森逮,比如AFN
,以及我們平常寫ViewModel的請(qǐng)求回調(diào)等磁携。
1.block作為參數(shù)
方法聲明
//方法聲明
- (void)play:(void(^)(void))block;
方法實(shí)現(xiàn)
//方法實(shí)現(xiàn)
- (void)play:(void(^)(void))block
{
block();
}
方法調(diào)用
//方法調(diào)用
Person * p = [[Person alloc] init];
[p play:^{
NSLog(@"玩?zhèn)€球...");
}];
2.block作為返回值
方法聲明
//無參 無返回值
- (void(^)(void))play;
//有參 無返回值
- (void(^)(NSString *))eat;
//有參 有返回值
- (NSString *(^)(NSString *))sleep;
方法實(shí)現(xiàn)
//無參 無返回值
- (void(^)(void))play
{
return ^(){
NSLog(@"來和妲己玩耍吧~");
};
}
//有參 無返回值
- (void(^)(NSString *))eat
{
return ^(NSString * food){
NSLog(@"吃了:%@~",food?:@"");
};
}
//有參 有返回值
- (NSString *(^)(NSString *))sleep
{
return ^(NSString * dream){
return [NSString stringWithFormat:@"做了個(gè)夢(mèng):%@",dream?:@""];
};
}
方法調(diào)用
Person * p = [[Person alloc] init];
p.play();
p.eat(@"牛排");
NSString * desc = p.sleep(@"你是豬");
需要說明的是OC想要使用.
語(yǔ)法來調(diào)用方法褒侧,只有get
和set
兩種方式
get
方法:有返回值,沒有參數(shù)
set
方法:有參數(shù)谊迄,無返回值
而我們調(diào)用p.eat(@"牛排")
闷供,eat 是get
方法,之所以能傳參數(shù)统诺,是因?yàn)閑at的返回值是帶參數(shù)的block
这吻,block如何調(diào)用?這個(gè)要不會(huì)罰你到幼兒園復(fù)習(xí)一年篙议!??所以()
其實(shí)是block的調(diào)用,而@"牛排"
則是block的參數(shù)怠硼。
鏈?zhǔn)骄幊?/h3>
編程思想
:把多個(gè)方法使用點(diǎn)語(yǔ)法鏈接起來鬼贱,讓代碼更加簡(jiǎn)潔,可讀性更強(qiáng)
編程特點(diǎn)
:方法的返回值必須是調(diào)用者本身
方法聲明
- (Person *)eat;
- (Person *)sleep;
方法實(shí)現(xiàn)
- (Person *)eat
{
NSLog(@"吃東西~");
return self;
}
- (Person *)sleep
{
NSLog(@"睡覺嘍~");
return self;
}
方法調(diào)用
Person * p = [[Person alloc] init];
//吃完就睡香璃,睡醒就吃
p.eat.sleep.eat;
函數(shù)式+鏈?zhǔn)骄幊?/h3>
函數(shù)式鏈?zhǔn)骄幊叹褪菍煞N編程思想結(jié)合起來这难,使代碼更緊湊,更優(yōu)雅葡秒。如果大家想深入了解函數(shù)式鏈?zhǔn)骄幊痰镊攘梢钥匆幌?code>Masonry源碼姻乓,以下是一個(gè)簡(jiǎn)單的例子說明。
方法聲明
- (Person *(^)(NSString *))eat;
- (Person *(^)(NSString *))play;
- (Person *(^)(NSString *))sleep;
方法實(shí)現(xiàn)
- (Person *(^)(NSString *))eat
{
return ^(NSString * food){
NSLog(@"吃了:%@",food?:@"");
return self;
};
}
- (Person *(^)(NSString *))play
{
return ^(NSString * toy){
NSLog(@"玩了:%@",toy?:@"");
return self;
};
}
- (Person *(^)(NSString *))sleep
{
return ^(NSString * dream){
NSLog(@"夢(mèng)見:%@",dream?:@"");
return self;
};
}
方法調(diào)用
Person * p = [[Person alloc] init];
p.eat(@"牛排").play(@"足球").sleep(@"你是豬");
輸出
2020-12-09 11:21:33.709949+0800 Demo[35715:15437815] 吃了:牛排
2020-12-09 11:21:33.710440+0800 Demo[35715:15437815] 玩了:足球
2020-12-09 11:21:33.710467+0800 Demo[35715:15437815] 夢(mèng)見:你是豬
2020-12-09 11:21:33.847314+0800 Demo[35715:15437815] Metal API Validation Enabled
應(yīng)用場(chǎng)景
其實(shí)函數(shù)式鏈?zhǔn)骄幊炭蓱?yīng)用的場(chǎng)景還挺多的眯牧,比如:
- UIView設(shè)置指定邊框
- UIView設(shè)置指定圓角
先簡(jiǎn)單記錄一下蹋岩,方便后續(xù)一一實(shí)現(xiàn)~
結(jié)語(yǔ)
條條大路通羅馬,關(guān)鍵在于選擇最短的一條学少。高級(jí)不一定適用剪个,合適才是最好的。GoodBye~??