iOS-OC创建链式语法(链式编程)

前言


我在工程中用到一个链式语法写的单利,有一个小伙伴对链式语法不是很清楚,瞬间感觉链式语法的高大上;我们也经常在一些第三方库里面看到链式语法。说到链式语法的好处,有如下几点:
1.习惯了OC括号语法,点语法给我的感觉是耳目一新,程序可以写出一点新异,而且点语法是最早最基础的语法结构,即:对象名.成员变量;
2.链式语法可读性比较强,接近自然语言,直接通过方法名就大致知道这个方法的作用;
3.精简代码;

实战

先给大家看一下我写的一个小demo,以单利的链式语法为例:

zvcZFJObjectShareInstance()是ZFJObject的实例化对象,“.”是对这个实例化对象的连续访问,而访问的是这个对象的一些方法,add(20)里面的数字是参数。


代码

ZFJObject.h里面

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@interface ZFJObject : NSObject

//创建单利
+ (instancetype)shareInstance;

//销毁店里
+ (void)destroyInstance;

//加法
@property (nonatomic,copy) ZFJObject *(^ add)(CGFloat num);

//减法
@property (nonatomic,copy) ZFJObject *(^ minus)(CGFloat num);

//乘法
@property (nonatomic,copy) ZFJObject *(^ multiply)(CGFloat num);

//除法
@property (nonatomic, copy) ZFJObject * (^divide)(CGFloat num);

//获取运算结果
@property (nonatomic, copy) ZFJObject * (^getResult)(void(^ getResultBlock)(CGFloat result));

ZFJObject * ZFJObjectShareInstance(void);

@end

ZFJObject.m里面

#import "ZFJObject.h"

@interface ZFJObject ()

@property (nonatomic,assign) CGFloat result;//保存结果

@end

static ZFJObject *_manager = nil;

@implementation ZFJObject

+ (instancetype)shareInstance{
    
    static dispatch_once_t oncePredicate;
    dispatch_once(&oncePredicate, ^{
        _manager = [[self alloc] init];
    });
    return _manager;
}

+ (void)destroyInstance {
    _manager = nil;
}

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

/**
 加法
 */
- (ZFJObject *(^)(CGFloat num))add{
    return ^(CGFloat num) {
        self.result += num;
        return [ZFJObject shareInstance];
    };
}

/**
 减法
 */
- (ZFJObject *(^)(CGFloat num))minus{
    return ^(CGFloat num) {
        self.result -= num;
        return [ZFJObject shareInstance];
    };
}

/**
 乘法
 */
- (ZFJObject *(^)(CGFloat num))multiply{
    return ^(CGFloat num) {
        self.result *= num;
        return [ZFJObject shareInstance];
    };
}

/**
 除法
 */
- (ZFJObject *(^)(CGFloat num))divide{
    return ^(CGFloat num) {
        NSAssert(num != 0, @"除数不能为零!");
        self.result /= num;
        return [ZFJObject shareInstance];
    };
}

/**
 结果
 */
- (ZFJObject *(^)(void(^ getResultBlock)(CGFloat result)))getResult{
    return ^(void(^ getResultBlock)(CGFloat result)) {
        if(getResultBlock){
            getResultBlock(self.result);
        }
        return [ZFJObject shareInstance];
    };
}

- (void)dealloc{
    NSLog(@"dealloc");
}

@end


ZFJObject * ZFJObjectShareInstance(void){
    return [ZFJObject shareInstance];
}

调用

ZFJObjectShareInstance().add(20).minus(2).multiply(2).divide(10).getResult(^(CGFloat result) {
        NSLog(@"result == %f",result);
    });

说明

如果我们想自己初始化一个对象,来实现链式语法只需要稍微修改一下就行,如:

/**
 加法
 */
- (ZFJObject *(^)(CGFloat num))add{
    return ^(CGFloat num) {
        self.result += num;
        return [ZFJObject shareInstance];
    };
}

改为:

/**
 加法
 */
- (ZFJObject *(^)(CGFloat num))add{
    return ^(CGFloat num) {
        self.result += num;
        return self;
    };
}

然后调用:

ZFJObject *zvc = [[ZFJObject alloc]init];
    zvc.add(20).minus(2).multiply(2).divide(10).getResult(^(CGFloat result) {
        NSLog(@"result == %f",result);
    });

推荐一个链式语法的约束库,一个朋友写的,简单好用,你不用再自己写约束条件,提高开发效率。

https://github.com/netyouli/WHC_AutoLayoutKit




猜你喜欢

转载自blog.csdn.net/u014220518/article/details/77884916