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

来源:互联网 发布:网络黑白 百度文学 编辑:程序博客网 时间:2024/05/22 06:26

前言


我在工程中用到一个链式语法写的单利,有一个小伙伴对链式语法不是很清楚,瞬间感觉链式语法的高大上;我们也经常在一些第三方库里面看到链式语法。说到链式语法的好处,有如下几点:
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;//保存结果@endstatic 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");}@endZFJObject * 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




原创粉丝点击