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