1. 程式人生 > >OC中鏈式程式設計和函數語言程式設計

OC中鏈式程式設計和函數語言程式設計

最近看到了鏈式程式設計和函數語言程式設計這兩個概念,這兩天不是那麼的忙 所以也研究了下這兩個概念;

在查詢鏈式程式設計和函數語言程式設計的概念時突然想到了鏈式程式設計和函數語言程式設計最典型的代表是Masonry 比較完美的實現了函數語言程式設計和鏈式程式設計 例如

[viewOne mas_makeConstraints:^(MASConstraintMaker *make) {

        make.top.equalTo(self.view).offset(100);

        make.centerX.equalTo(self.view.mas_centerX).offset

(100);

        make.height.mas_equalTo(100);

        make.width.mas_equalTo(100);

    }];

其實 仔細考慮了下 所謂的鏈式程式設計其實就是 在返回值的基礎上 繼續呼叫方法,那麼問題來了 什麼樣的返回值才能呼叫方法 答案是 物件 只要返回物件 然後呼叫對應的物件方法即可實現 鏈式程式設計 例如 最簡單的鏈式程式設計

- (Person *(^)())eat3;

- (Person *(^)())run3;

[[person eat]run];


這樣的鏈式程式設計 和Masonry 確實有點相差甚遠

我們知道在OC中的方法呼叫是 傳送訊息的方式實現的那麼 要實現 person.eat 該怎麼實現呢?

那麼我們就想到了 Xcode的編譯器特性 類似於 getter 和setter方法,尤其是getter方法 就是將 NSString *nameOne =  peron.name  轉化成了  NSString *nameOne =  [peron name] 那麼類似的做法 我們是不是可以將 方法呼叫寫成  : person.eat呢?答案是可以的 但是這樣是有警告的但是 可以執行 那麼只要我的eat 方法的返回值是Person 類物件 那麼我就可以實現鏈式程式設計 ,但是這樣寫又沒有什麼意義,我們觀察Maronry中是將函數語言程式設計和鏈式程式設計結合起來使用的那麼我們先了解下OC中的函數語言程式設計的實現

 先介紹下 函數語言程式設計 然後慢慢過渡到鏈式程式設計

首先所謂函數語言程式設計 就是通過類似於 函式呼叫的方式實現想要的功能即 method(); 這樣的方式,

那麼我們知道在OC能用method() 這樣呼叫,只有一個可以實現,那就是BLOCK, 我們在呼叫BLOCK時 不就是這樣呼叫的嗎?  那麼我們知道只要我的一個方法的返回值是BLOCK的時候就可以使用函式式呼叫了例如

- (void(^)())eat2;

- (void(^)())run2;

- (void (^)())eat2 {

return ^{

NSLog(@"block === %s",__func__);

    };

}

- (void (^)())run2 {

return ^(){

NSLog(@"block == %s",__func__);

    };

}

但是這樣具有侷限性就是隻能呼叫一次

person.eat2();

person.run2();

不能實現 person.eat2().run2();

那麼我們猜想了只要eat2中block的返回值是Person類物件 是不是就可以實現了呢?

於是 測試例子 

- (Person *(^)())eat3;

- (Person *(^)())run3 ;

- (Person *(^)())eat3 {

return ^(){

NSLog(@"block == %s",__func__);

returnself;

    };

}

- (Person *(^)())run3 {

return ^{

NSLog(@"block ==== %s",__func__);

returnself;

    };

}

此時就可以實現  person.eat3().run3(); 此時距離Masonry的樣式就越來越接近了

那麼我們知道 無論是eat3還是run3 的返回值是 返回Person型別的block,當我們 person.run3()時就是呼叫了run3返回回來的block,那麼我們知道了 當我們返回的block中帶有引數 是不是就可以實現person.run3(引數).eat3(引數);

於是: 

- (Person *(^)(NSString *food))eat4{

return ^(NSString *food){

NSLog(@"吃了%@",food);

returnself;

    };

}

- (Person *(^)(int distance))run4 {

return ^(int distance){

NSLog(@"跑了%d",distance);

returnself;

    };

}


這樣就可以實現 

NSLog(@"=========");

    person.eat4(@"大骨頭").run4(10000);

NSLog(@"=========");

    person.run4(200000).eat4(@"小魚");

了  


相關推薦

OC程式設計語言程式設計

最近看到了鏈式程式設計和函數語言程式設計這兩個概念,這兩天不是那麼的忙 所以也研究了下這兩個概念; 在查詢鏈式程式設計和函數語言程式設計的概念時突然想到了鏈式程式設計和函數語言程式設計最典型的代表是Masonry 比較完美的實現了函數語言程式設計和鏈式程式設計 例如 [

一步一步教你理解實現iOS程式設計語言程式設計

談到鏈式程式設計和函數語言程式設計,那Masonry幾乎就是最經典的代表.如: make.top.equalTo(self.view).offset(60) 像這樣top.equalTo(s

Python包結構語言程式設計

# 包的結構 |--包 |--|-- __init__.py 包的標誌檔案 |--|-- 模組1 |--|-- 模組2 |--|-- 子包(子資料夾) |--|--|-- __init__.py 包的標誌檔案 |--|--|-- 子包模組1 |--|--|--

遞迴、尾遞迴語言程式設計

<span style="font-family:SimSun">function fibonacciDynamically(n){ var fibonacci =new Array(n+1); return calculate(n); } function calculate(n){ if

指令程式設計 vs 語言程式設計 vs 反應程式設計

指令式程式設計 存在潛在的阻塞。 函數語言程式設計 避免處理資料的中間狀態。可以方便的處理資料流。 反應式程式設計 多種方式使用資料流,合併,過濾和轉換等。 抽象層次更高,關注於如何把小的方法

『 Python筆記』 lambda表示式語言程式設計

lambda表示式 lambda用來編寫簡單的函式,而def用來處理更強大的任務。 lambda的一般形式是關鍵字lambda後面跟一個或多個引數,緊跟一個冒號,以後是一個表示式。 lambda是一個表示式而不是一個語句。它能夠出現在Python語法不允許

java 8 部分新特性語言程式設計

1.介面可以新增非抽象的方法和靜態方法,使用關鍵字 default 即可 程式碼如下: public interface Defaulable { void printName(); default void printAge(){

面向物件程式設計(OOP)語言程式設計(FP)的思考

最近看過不少 JavaScript 的類(實際是巢狀 function),自己也寫了一些,發現一個值得思考的問題。有的作者可能為了提高一點效能,喜歡有事沒事把方法裡面的某個變數做成類的欄位(attribute)。而實際上,這些變數往往作用域在單個方法內一樣工作的很好,就

Java程式設計邏輯-語言程式設計1

第一章 你好,lambda表示式! 第一節 Java的編碼風格正面臨著翻天覆地的變化。我們每天的工作將會變成更簡單方便,更富表現力。Java這種新的程式設計方式早在數十年前就已經出現在別的程式語言裡面了。這些新特性引入Java後,我們可以寫出更簡潔,優雅,表達性更強,錯誤更少的程式碼。我

JavaSE(十二)網路程式設計、JDBC程式設計語言程式設計

網路程式設計、JDBC程式設計、函數語言程式設計 網路程式設計 Socket TCP程式設計 UDP程式設計 Email 傳送Email 傳送文字郵件

【Java 程式設計語言程式設計一點通

文章目錄 1. 指令式程式設計 2. 宣告式程式設計 3. 函數語言程式設計 4. 函式介面 5. Built-in 函式介面 參考 https://developer.ibm.com/arti

在Scala使用語言程式設計(函式高階函式)

                                            圖示,這是一個普通

Java FP: Java語言程式設計的MapFold(Reduce)

原文連結 作者:  Cyrille Martraire  譯者: 李璟([email protected]) 在函數語言程式設計中,Map和Fold是兩個非常有用的操作,它們存在於每一個函數語言程式設計語言中。既然Map和Fold操作如此強大和重要,但是Java語言缺乏Map和Fol

Java FP(Java8): Java語言程式設計的MapFold(Reduce)

public double totalAmount(List<Double> amounts) { double sum = 0; for(double amount : amounts) { sum += amount; } return sum

響應語言程式設計RxJava的理解

面向函數語言程式設計, 即會將函式作為一個數據物件.下面看Android中RxJava的實現 RxJava 是一個觀察者模式的擴充套件: RxJava 一個觀察者模式的擴充套件, 觀察者模式: 比如Button的點選事件,對設定 OnClickListener 來說, Bu

語言程式設計響應程式設計

在程式開發中,a=b+c;賦值之後,b或者c的值變化後,a的值不會跟著變化。響應式程式設計目標就是,如果b或者c的數值發生變化,a的數值會同時發生變化。 函數語言程式設計 函數語言程式設計是一系列被不公平對待的程式設計思想的保護傘,它的核心思想是,它是一

語言程式設計指令程式設計

突然直接明白了他們的含義。所謂指令式程式設計,是以命令為主的,給機器提供一條又一條的命令序列讓其原封不動的執行。程式執行的效率取決於執行命令的數量。因此才會出現大O表示法等等表示時間空間複雜度的符號。而函式式語言並不是通常意義上理解的“通過函式的變換進行程式設計”。注意到純的

ReactiveCocoa 函式響應程式設計簡介 程式設計 語言程式設計 響應程式設計

最近,RAC的名氣可謂是越來越大,出於對技術的探索心(為了裝逼),最近研究學習了一下RAC,以下是本人在學習中對其的一些粗淺的認識; 首先,什麼是RAC,ReactiveCocoa時Github上的一個Cocoa FRP框架,目的為了接管蘋果的所有事件機制(addTarge

通過代數,數字,歐幾里得平面分形討論JavaScript語言程式設計

本文是對函數語言程式設計正規化的系列文章從而拉開了與以下延續一個。 介紹 在JavaScript中,函式只是物件。因此,可以建構函式,作為引數傳遞,從函式返回或分配給變數。因此,JavaScript具有一流的功能。更準確地說,JavaScript支援以下內容: 高階函式引數 產生高階函式 巢狀函式 匿名

多角度讓你徹底明白yield語法糖的用法原理及在C#語言程式設計的作用

如果大家讀過dapper原始碼,你會發現這內部有很多方法都用到了yield關鍵詞,那yield到底是用來幹嘛的,能不能拿掉,拿掉與不拿掉有多大的差別,首先上一段dapper中精簡後的Query方法,先讓大家眼見為實。 private static IEnumerable<T> Qu