iOS小技能:鏈式程式設計在iOS開發中的應用
攜手創作,共同成長!這是我參與「掘金日新計劃 · 8 月更文挑戰」的第31天,點選檢視活動詳情
I 預備知識
先來了解下開發過程中常常接觸的幾個程式設計思想
1.1 面向過程
處理事情以過程為核心,一步一步的實現。
1.2 面向物件
萬物皆物件
面向物件對比面向過程的優勝之處在於,名詞化的概念比動詞化的描述,更便於人類理解。
這也是相比函數語言程式設計的主要優點,許多函式是難以命名的,但物件卻很容易。
封裝是為了更好的重用性、可擴充套件性,但要綜合考慮效能問題,即使新增了判斷也會增加效能的消耗,只是不會量級的增加。比如簡單工廠和抽象工廠(反射機制)的封裝,會增加效能的消耗。但把物件的管理變成了可配置化。
1.3 函數語言程式設計
把操作儘量寫成一系列巢狀的函式或者方法呼叫。
函數語言程式設計特點:每個方法必須有返回值(本身物件),把函式或者Block當做引數,block引數(需要操作的值)block返回值(操作結果) 代表:ReactiveCocoa
1.4 鏈式程式設計
將多個操作(多行程式碼)通過點號(.)連結在一起成為一句程式碼,使程式碼可讀性好a(1).b(2).c(3)。
鏈式程式設計特點:方法的返回值是block,block必須有返回值(本身物件),block引數(需要操作的值)
代表:masonry框架
objectivec
p.run() <=> [p run]();//執行方法的同時之後,立即執行方法返回的block
1.5 響應式程式設計
不需要考慮呼叫順序,只需要知道考慮結果,類似於蝴蝶效應,產生一個事件,會影響很多東西,這些事件像流一樣的傳播出去,然後影響結果,借用面向物件的一句話,萬物皆是流。
代表: 1. KVO 是 Objective-C 對觀察者模式(Observer Pattern)的實現,也是 Cocoa Binding 的基礎。當被觀察物件的某個屬性發生更改時,觀察者物件會獲得通知。 2. Reactive Cocoa框架 3. vuejs: https://staging-cn.vuejs.org/guide/introduction.html
II 鏈式程式設計的例子
2.1 實現鏈式程式設計的兩種形式
-
宣告屬性,屬性的型別是block,block必須有返回值(本身物件),block引數(需要操作的值)
-
`宣告方法: 就是執行(getter)方法之後,得到一個block,block必須有返回值(本身物件),block引數(需要操作的值)
缺點就是 Xcode提示不太友好。不推薦`
兩種實現方式本質都是一樣的:
- 如果想再去呼叫別的物件方法,那麼就需要返回一個物件;
- 如果想用()去執行,那麼需要返回一個block;
- 如果想讓返回的block再呼叫物件的方法,那麼這個block就需要返回一個物件。
2.2 通過宣告方法形式實現鏈式程式設計
缺點: Xcode提示不太友好(不推薦)
block 實現鏈式程式設計的例子1:(將block和method的特性 結合起來) https://github.com/zhangkn/DKUsingblockImplementChainProgramming
直接宣告方法的返回值是block,block必須有返回值(本身物件),block引數(需要操作的值)
例子: p.run() <=> [p run]()
效果:p.run() <=> [p run]();// 執行方法的同時之後,立即執行方法返回的block。
```objectivec int main(int argc, const char * argv[]) { @autoreleasepool { // insert code here... //使用block實現鏈式程式設計 People *p= [[People alloc]init]; // p.run() <=> p run;// 執行方法的同時之後,立即執行方法返回的block。 p.run().study();
p.run().name(@"將block和method的特性 結合起來");
}
return 0;
} ```
程式碼的實現 ```objectivec
import "People.h"
@implementation People
-
(People *(^)())run{ return ^{ NSLog(@"run"); return self; };// 返回一個block }
-
(People *(^)())study{ return ^{ NSLog(@"study"); return self; };// 返回一個block }
-
(People (^)(NSString ))name{ return ^(NSString *name){ NSLog(@"%@",name); return self; }; }
```
2.3 通過宣告屬性形式實現鏈式程式設計
宣告屬性,屬性的型別是block,block必須有返回值(本身物件),block引數(需要操作的值)
宣告屬性: 本質就是利用他的getter方法
完整SDK原始碼【封裝富文字API,採用block實現鏈式程式設計】(block 的妙用:結合block和方法的優點實現iOS的鏈式程式設計)
文章:https://blog.csdn.net/z929118967/article/details/107835195
從CSDN資源下載完整SDK程式碼:https://download.csdn.net/download/u011018979/14038715
部分API
- 用法例子
![]()
![]()
```objectivec NSMutableAttributedString *xx = [[NSMutableAttributedString alloc]init];
xx.kn_addString(@"封裝富文字API").kn_fontColor(UIColor.redColor).kn_addString(@"採用block實現鏈式程式設計").kn_fontColor(UIColor.blueColor).kn_addString(@"!");
```
以Masonry 框架為例子,進行分析
呼叫的equalTo:方法 返回的就是一個返回值為MASConstraint的block
objectivec
- (MASConstraint * (^)(id))equalTo { return ^id(id attribute) { return self.equalToWithRelation(attribute, NSLayoutRelationEqual); }; }
用法
```objectivec - (UIImageView *)imgForReason{
if (nil == _imgForReason) {
UIImageView *img2 = [[UIImageView alloc] init];
_imgForReason = img2;
[self addSubview:_imgForReason];
[img2 mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.mas_left).offset(25);
make.top.equalTo(self.imgForPassword.mas_bottom).offset(12);
make.size.mas_equalTo(CGSizeMake(kScreenWidth-100, 76));
}];
}
return _imgForReason;
} ```
see also
iOS富文字&圖文混排的使用指南
1、封裝富文字API,採用block實現鏈式程式設計
2、 超連結屬性
3、HTML字串與富文字互轉
4、建立帶有圖片的富文字
————————————————
版權宣告:本文為CSDN博主「#公眾號:iOS逆向」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處連結及本宣告。
原文連結:https://blog.csdn.net/z929118967/article/details/114014827
公眾號:iOS逆向
- iOS小技能:UITableView的適配 (iOS10/iOS14/iOS16.0)
- iOS小技能:和uni-app、unity的融合方案
- iOS小技能:iOS15崩潰排查技巧(symbolicatecrash符號化分析問題、匯出和隱藏符號)
- iOS小技能:【intercept the HTTP/HTTPS requests 】利用NSURLProtocol 攔截請求
- iOS小技能: tweak 整合CocoaAsyncSocket(建連、斷開、重連、心跳、通用請求)
- iOS小技能:iOS13 證件掃描 & 文字識別API
- iOS小技能:整合下拉重新整理控制元件 & 實現無感知上拉載入更多
- iOS小技能:程式碼觸發button的點選事件、快速找到按鈕action方法
- iOS小技能:撥號、發郵件、簡訊、應用間跳轉
- iOS小技能:鏈式程式設計在iOS開發中的應用
- iOS小技能:iOS14 讀取使用者剪下板資料彈出提示的相容方案
- iOS小技能:因境外IP無法訪問導致 App 被拒的解決方案
- iOS小技能:RSA簽名、驗籤、加密、解密的原理
- iOS小技能:Xcode14新特性(適配)
- iOS小技能:Socket基礎知識
- iOS小技能:SKU檢視搭建
- iOS小技能: 日曆的使用(案例:兩個時間的比較、獲取最近30天的資料)
- iOS小技能:1. iOS 實現json資料提交 2. 對同一個URL的多次請求進行資料快取 3. 檢查網路狀態
- iOS小技能:使用正則表示式對聊天記錄的關鍵詞進行監控
- iOS小技能:去掉/新增導航欄黑邊(iOS13適配)