1.RAC解析 - 自定義鏈式編程

目的

模仿Masonry連續運用點語法的操做git

[self.view mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.equalTo(@10).offset(1);
    }];

寫出一個連加的操做github

make.add(10).add(10);

想看結果的請直接跳到「最終結果」

分析

一.定義SQMath類

SQMath.h面試

#import <Foundation/Foundation.h>

@interface SQMath : NSObject

- (NSInteger)result;

- (void)add:(int)number;

@end

SQMath.m編程

#import "SQMath.h"

@interface SQMath ()

@property (nonatomic, assign) NSInteger number;

@end

@implementation SQMath

- (NSInteger)result {
    return self.number;
}

- (void)add:(int)number {
    self.number += number;
}

@end

使用這個SQMath的add方法函數

SQMath *math = [[SQMath alloc] init];
    [math add:10];
    [math add:20];
    NSLog(@"%ld", [math result]);
二.將函數調用改成點語法

若是要用點語法,須要讓-add從一個方法變成一個add的屬性。可是這樣就沒有辦法傳參了atom

- (NSInteger)add;

可是若是返回值是一個 NSInteger (^)(NSInteger) 類型的block就能夠了。math.add返回的是這個block,這個block是須要一個NSInteger爲參數(加數),返回值是NSInteger(結果)。code

SQMath.m對象

- (NSInteger (^)(NSInteger count))add {
    __weak typeof(self) weakSelf=self;
    NSInteger (^addBlock)(NSInteger) = ^(NSInteger addCount){
        __strong typeof(weakSelf) strongSelf = weakSelf;
        strongSelf.number += addCount;
        return strongSelf.number;
    };

    return addBlock;
}

或者get

- (NSInteger (^)(NSInteger count))add {
    __weak typeof(self) weakSelf=self;
    return ^(NSInteger addCount) {
        __strong typeof(weakSelf) strongSelf = weakSelf;
        strongSelf.number += addCount;
        return strongSelf.number;
    };
}

使用這個SQMath的add方法it

SQMath *math = [[SQMath alloc] init];
    NSLog(@"%ld", math.add(10));
    NSLog(@"%ld", math.add(20));
    NSLog(@"%ld", math.add(30));
三.連續使用點語法

只要將Block的返回值更改成self。這樣每次add返回的則變成了SQMath的實例對象,這樣就能夠實現連續點語法的效果了。

- (SQMath* (^)(NSInteger count))add {
    __weak typeof(self) weakSelf=self;
    return ^(NSInteger addCount) {
        __strong typeof(weakSelf) strongSelf = weakSelf;
        strongSelf.number += addCount;
        return self;
    };
}

使用這個SQMath的add方法

SQMath *math = [[SQMath alloc] init];
NSLog(@"%ld", math.add(10).add(20).add(30).result) ;
四.將這個改成NSNumber的Category

NSNumber+SQMath.h

#import <Foundation/Foundation.h>
#import "SQMath.h"

@interface NSNumber (Math)

- (NSInteger)sq_add:(void(^)(SQMath *make))block;

@end

NSNumber+SQMath.m

#import "NSNumber+SQMath.h"

@implementation NSNumber (SQMath)

- (NSInteger)sq_add:(void(^)(SQMath *))block {
    SQMath *math = [[SQMath alloc] init];
    block(math);
    return math.result;
}

@end

NSNumber+SQMath 使用

NSInteger result = [@10 sq_add:^(SQMath * make) {
        make.add(10).add(20);
    }];
    
    NSLog(@"%ld", result);

最終結果

SQChainProgramming

ps:鏈式編程何時用我還真不太清楚,但我知道面試的時候確定有用 哈哈。

相關文章
相關標籤/搜索