你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發基礎 >> 鏈式編程思想

鏈式編程思想

編輯:IOS開發基礎

1.jpg

在使用 masonry 框架實現自動布局時,在程序裡為一個布局穿插著6行左右這樣的代碼

[View mas_makeConstraints:^(MASConstraintMaker *make) {

      make.top.equalTo(anotherView);

      make.left.equalTo(anotherView);

      make.width.mas_equalTo(@60);

      make.height.mas_equalTo(@60);

}];

一直覺得不夠漂亮,希望有個一行代碼設置約束的框架,我曾嘗試過在masonry上封裝一個類別 UIView+HKSetConstraints ,用起來也不順手,總覺得不夠味,直到我見到了 SDAutoLayout , 真正的實現了一句代碼實現自動布局,加上研究ReactiveCocoa時看到的最快讓你上手之ReactiveCocoa基礎篇(下面會給出鏈接)提到編程思想,才明了Masonry 和 SDAutoLayout一點實現思路:鏈式編程思想,分享下自己的心得,希望是大家喜歡的東西, ps: 這是本人第一次分享文章,寫的不好請指出,下次好改正。


接下來的部分摘自:最快讓你上手之ReactiveCocoa基礎篇

先簡單介紹下目前咱們已知的編程思想。

1 面向過程:處理事情以過程為核心,一步一步的實現。

2 面向對象:萬物皆對象

3 鏈式編程思想:是將多個操作(多行代碼)通過點號(.)鏈接在一起成為一句代碼,使代碼可讀性好。a(1).b(2).c(3)

  • 鏈式編程特點:方法的返回值是block,block必須有返回值(本身對象),block參數(需要操作的值)

  • 代表:Masonry框架。

4 響應式編程思想:不需要考慮調用順序,只需要知道考慮結果,類似於蝴蝶效應,產生一個事件,會影響很多東西,這些事件像流一樣的傳播出去,然後影響結果,借用面向對象的一句話,萬物皆是流。

  • 代表:KVO運用。

5 函數式編程思想:是把操作盡量寫成一系列嵌套的函數或者方法調用。

  • 函數式編程特點:每個方法必須有返回值(本身對象),把函數或者Block當做參數,block參數(需要操作的值)block返回值(操作結果)

  • 代表:ReactiveCocoa。

  • 用函數式編程實現,寫一個加法計算器,並且加法計算器自帶判斷是否等於某個值.

我們這裡以鏈式編程思想代碼實現一個計算器:

#import

@class CaculatorMaker;

@interface NSObject (CaculatorMaker)


//計算

+ (int)makeCaculators:(void(^)(CaculatorMaker *make))caculatorMaker;


@end


#import "NSObject+CaculatorMaker.h"

#import "CaculatorMaker.h"


@implementation NSObject (CaculatorMaker)


//計算

+ (int)makeCaculators:(void(^)(CaculatorMaker *make))block

{

    CaculatorMaker *mgr = [[CaculatorMaker alloc] init];

    block(mgr);

    return mgr.iResult;

}


@end


#import


@interface CaculatorMaker : NSObject


@property (nonatomic, assign) int iResult;


//加法

- (CaculatorMaker *(^)(int))add;


//減法

- (CaculatorMaker *(^)(int))sub;


//乘法

- (CaculatorMaker *(^)(int))muilt;


//除法

- (CaculatorMaker *(^)(int))divide;


@end



#import "CaculatorMaker.h"


@implementation CaculatorMaker


- (CaculatorMaker *(^)(int))add

{

   return ^(int value)

    {

        _iResult += value;

        return self;

    };

}


@end


調用:

int iResult = [NSObject makeCaculators:^(CaculatorMaker *make) {

     make.add(1).add(2).add(3).divide(2);

   }];


分析下這個方法執行過程:

第一步:NSObject 創建了一個block, 這個block裡創建了一個CaculatorMaker對象make,並返回出來

第二步:這個對象make調用方法add時,裡面持有的屬性iResult做了一個加法,並且返回自己,以便可以接下去繼續調用方法。 

這就是鏈式編程思想的一個很小但很明了的例子。


現在我們以 Masonry 舉例:

我們看看Masonry的

- (NSArray *)mas_makeConstraints:(void(^)(MASConstraintMaker *make))block;

- (NSArray *)mas_makeConstraints:(void(^)(MASConstraintMaker *))block {

    self.translatesAutoresizingMaskIntoConstraints = NO;

    MASConstraintMaker *constraintMaker = [[MASConstraintMaker alloc] initWithView:self];

    block(constraintMaker);

    return [constraintMaker install];

}


是不是跟我們的計算器的類別一個樣????? 

我們再來看看它的

- (MASConstraint * (^)(id attr))mas_equalTo;

- (MASConstraint * (^)(id))mas_equalTo {

    return ^id(id attribute) {

        return self.equalToWithRelation(attribute, NSLayoutRelationEqual);

    };

}


看看它的self.equalToWithRelation實現:

- (MASConstraint * (^)(id, NSLayoutRelation))equalToWithRelation {

    return ^id(id attribute, NSLayoutRelation relation) {

        if ([attribute isKindOfClass:NSArray.class]) {

            NSAssert(!self.hasLayoutRelation, @"Redefinition of constraint relation");

            NSMutableArray *children = NSMutableArray.new;

            for (id attr in attribute) {

                MASViewConstraint *viewConstraint = [self copy];

                viewConstraint.secondViewAttribute = attr;

                [children addObject:viewConstraint];

            }

            MASCompositeConstraint *compositeConstraint = [[MASCompositeConstraint alloc] initWithChildren:children];

            compositeConstraint.delegate = self.delegate;

            [self.delegate constraint:self shouldBeReplacedWithConstraint:compositeConstraint];

            return compositeConstraint;

        } else {

            NSAssert(!self.hasLayoutRelation || self.layoutRelation == relation && [attribute isKindOfClass:NSValue.class], @"Redefinition of constraint relation");

            self.layoutRelation = relation;

            self.secondViewAttribute = attribute;

            return self;

        }

    };

}


的確是返回自己,所以這正是它的鏈式編程思想的體現。

由於本人沒有繼續研究Masonry, 研究神的同學可以繼續分享它的更詳細的思路。

關於鏈式編程,我希望沒接觸過的同學以後封裝類似的類時,可以朝著這方向思考,少走彎路,謝謝!

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved