iOS小技能:鏈式編程在iOS開發中的應用

語言: CN / TW / HK

攜手創作,共同成長!這是我參與「掘金日新計劃 · 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: http://staging-cn.vuejs.org/guide/introduction.html

II 鏈式編程的例子

2.1 實現鏈式編程的兩種形式

  1. 聲明屬性,屬性的類型是block,block必須有返回值(本身對象),block參數(需要操作的值)

  2. `聲明方法: 就是執行(getter)方法之後,得到一個block,block必須有返回值(本身對象),block參數(需要操作的值)

    缺點就是 Xcode提示不太友好。不推薦`

    兩種實現方式本質都是一樣的:

  3. 如果想再去調用別的對象方法,那麼就需要返回一個對象;
  4. 如果想用()去執行,那麼需要返回一個block;
  5. 如果想讓返回的block再調用對象的方法,那麼這個block就需要返回一個對象。

2.2 通過聲明方法形式實現鏈式編程

缺點: Xcode提示不太友好(不推薦)

block 實現鏈式編程的例子1:(將block和method的特性 結合起來) http://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的鏈式編程)

  1. 文章:http://blog.csdn.net/z929118967/article/details/107835195

  2. 從CSDN資源下載完整SDK代碼:http://download.csdn.net/download/u011018979/14038715

  3. 部分API

在這裏插入圖片描述

  1. 用法例子 在這裏插入圖片描述 在這裏插入圖片描述 在這裏插入圖片描述

```objectivec NSMutableAttributedString *xx = [[NSMutableAttributedString alloc]init];

xx.kn_addString(@"封裝富文本API").kn_fontColor(UIColor.redColor).kn_addString(@"採用block實現鏈式編程").kn_fontColor(UIColor.blueColor).kn_addString(@"!");

```

http://github.com/zhangkn/ChainAttributedString

以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版權協議,轉載請附上原文出處鏈接及本聲明。

原文鏈接:http://blog.csdn.net/z929118967/article/details/114014827

公眾號:iOS逆向