Objective-C實現類似Masonry的鏈式句法

前言

最近對Masonry的鏈式句法很感興趣,于是嘗試自己實現該效果.我是做了一個加法器,用法如下:

int result = [NSObject makeCaculator:^(CaculatorMaker *make) {
      make.add(2).add(4);
    }];
    NSLog(@"result is %d", result);

打印結果:

2016-02-20 15:18:17.178 練習鏈式語法封裝[30206:1952288] result is 6

思路

實現鏈式句法主要原理是利用OC的block特性,addmake對象的一個block屬性,定義如下:

@property (copy, nonatomic, readonly) CaculatorMaker *(^add)(int);

該block屬性以block的形式被調用時,會用到一個int參數,返回一個CaculatorMaker對象(其實是返回的self),然后返回的CaculatorMaker對象可以再次調用自己的add屬性,從而達到鏈式句法的效果


具體實現

  • NSObject+Caculator.h 文件
#import <Foundation/Foundation.h>
@class CaculatorMaker;
//NSObject類的拓展
@interface NSObject (Caculator)
+ (int)makeCaculator:(void (^)(CaculatorMaker *make)) caculatorBlock;

@end

//CaculatorMaker類的聲明
@interface CaculatorMaker : NSObject
@property (assign, nonatomic) int result;
@property (copy, nonatomic, readonly) CaculatorMaker *(^add)(int);

@end
  • NSObject+Caculator.m 文件
#import "NSObject+Caculator.h"

@implementation NSObject (Caculator)

+ (int)makeCaculator:(void (^)(CaculatorMaker *))caculatorBlock {
    CaculatorMaker *make = [CaculatorMaker new];
    caculatorBlock(make);
    return make.result;
}

@end

@implementation CaculatorMaker

- (instancetype)init
{
    self = [super init];
    if (self) {
        self.result = 0;
    }
    return self;
}

- (CaculatorMaker *(^)(int))add {
    return ^(int a){
        self.result += a;
        return self;
    };
}

@end

后記

希望和大家共同學習,其實我是來practice markdown的O(∩_∩)O~

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容