澳门威利斯人_威利斯人娱乐「手机版」

来自 澳门威利斯人 2020-04-24 16:22 的文章
当前位置: 澳门威利斯人 > 澳门威利斯人 > 正文

【奥门威尼人】iOS链式语法的实现,C中链式编程

前段时间都水肿,干脆起床写博客!首先来探访一段代码:

JHChainableAnimations源码学习

何为链式编程,举个例证表达

[self.view1 mas_makeConstraints:^(MASConstraintMaker *make) { make.left.mas_equalTo; make.right.mas_equalTo; make.top.mas_equalTo; make.bottom.mas_equalTo; }];

JHChainableAnimations是什么

JHChainableAnimations 是多少个多系统动漫封装的链式语法库。

村生泊长的OC代码借使我们想写二个动漫片,要求那样写。

    [UIView animateWithDuration:1.0
                          delay:0.0
         usingSpringWithDamping:0.8
          initialSpringVelocity:1.0
                        options:0 animations:^{
                            CGPoint newPosition = self.myView.frame.origin;
                            newPosition.x  = 50;
                            self.myView.frame.origin = newPosition;
    } completion:^(BOOL finished) {
        [UIView animateWithDuration:0.5
                              delay:0.0
                            options:UIViewAnimationOptionCurveEaseIn
                         animations:^{
            self.myView.backgroundColor = [UIColor purpleColor];
        } completion:nil];
    }];

使用 JHChainableAnimations 能够如此写:

JHChainableAnimator *animator = [[JHChainableAnimator alloc] initWithView:self.myView];
animator.moveX(50).spring.thenAfter(1.0).makeBackground([UIColor purpleColor]).easeIn.animate(0.5);

代码一下就呈现非常清晰明了,JHChainableAnimations 选用了前天盛行的链式语法,跟 Masonry 相通的语法。

make.top.equalTo(self.view).and.offset(100);

对,那些便是Objective-C的 点链式语法 ,本文就写写关于点链式语法的兑现, 直接上代码:

链式语法的特色是什么样

链式编制程序特点:方法的重返值是block,block必需有再次来到值(本人对象),block参数(须要操作的值)

像这么make.top.equalTo(self.view卡塔尔.and.offset(100透过”.”语法,将需求实践的代码块接二连三的书写下去,便是链式编制程序。像那样equalTo(self.view卡塔尔(قطر‎通过’(卡塔尔国’去调用函数,寻常调用完回到的照旧这么些目的自己,便是函数式编制程序。

CalculatorTools.h

JHChainableAnimations代码具体深入分析

第一看一段代码

JHChainableAnimator *animator = [[JHChainableAnimator alloc] initWithView:self.myView];
animator.moveX(100).animate(2);

首先是将 self.myViewJHChainableAnimator *animator 关联起来,然后经过 JHChainableAnimator *animator 举办动画设置。

第二行代码
animator.moveX(100).animate(2);

首先是 animator 调用 moveX 方法生成动漫样式,这一个法子从字面上边看 就是 移动视图的X轴,然后调用 animate 实行动漫,设置动画时间。具体看先 它是怎样兑现的。

- (JHChainableFloat)moveX
{
    JHChainableFloat chainable = JHChainableFloat(f) {

        [self addAnimationCalculationAction:^(__weak UIView *view, __weak JHChainableAnimator *weakSelf) {
            JHKeyframeAnimation *positionAnimation = [weakSelf basicAnimationForKeyPath:@"position.x"];
            positionAnimation.fromValue = @(view.layer.position.x);
            positionAnimation.toValue = @(view.layer.position.x f);
            [weakSelf addAnimationFromCalculationBlock:positionAnimation];
        }];
        [self addAnimationCompletionAction:^(__weak UIView *view, __weak JHChainableAnimator *weakSelf) {
            CGPoint position = view.layer.position;
            position.x  = f;
            view.layer.position = position;
        }];

        return self;
    };
    return chainable;
}

再来回想下链式语法的表征:

方式的重返值是block,block必得有再次来到值(本人对象),block参数(需求操作的值)

再来看下边这段代码:

  1. moveX 方法重返的是一个 block chainable
  2. block 的参数是一个 float
  3. block chainable 的重回值是当下类 JHChainableAnimator 实例。

完全符合链式语法的性状。

落到实处链式编制程序的主要正是声称三个block的质量,而以此block重返值是三个目的(依照工作需求区别,可以回去的是其一指标实例本人,也得以是其一类的另三个实例),而block中内部的逻辑正是项指标作业逻辑。

@interface CalculatorTools : NSObject// 计算结果@property (nonatomic, assign) NSInteger result;// 加法- (CalculatorTools *(NSInteger num)) add;// 减法- (CalculatorTools *(NSInteger num)) minus;// 乘法- (CalculatorTools *(NSInteger num)) multiply;// 除法- (CalculatorTools *(NSInteger num)) divide; @end

moveX 具体落成

然后再来看现实贯彻,moveX 干了怎么。

第一是回去了三个 block,然后这一个 block 重临了那么些类本人的实例。

例子:

CalculatorTools.m

block chainable 都做了什么
  1. 变动三个可施行的卡通片
     [self addAnimationCalculationAction:^(__weak UIView *view, __weak JHChainableAnimator *weakSelf) {
            JHKeyframeAnimation *positionAnimation = [weakSelf basicAnimationForKeyPath:@"position.x"];
            positionAnimation.fromValue = @(view.layer.position.x);
            positionAnimation.toValue = @(view.layer.position.x f);
            [weakSelf addAnimationFromCalculationBlock:positionAnimation];
        }];
  1. 转移有个卡通试行完结的回调,矫重视图属性
    [self addAnimationCompletionAction:^(__weak UIView *view, __weak JHChainableAnimator *weakSelf) {
            CGPoint position = view.layer.position;
            position.x  = f;
            view.layer.position = position;
        }];
  1. 回去 当前类自个儿
@interface CaculatorMaker : NSObject
@property (nonatomic, assign) int result;

- (void)add:(int)a;
- (void)sub:(int)a;

@implementation CaculatorMaker
- (void)add:(int)a{
    _result  = a;
}
- (void)sub:(int)a{
    _result -= a;
}
@end

 CaculatorMaker *maker = [[CaculatorMaker alloc]init];
 [maker add:10];
 [maker sub:2];
 int result = maker.result;
 NSLog(@“得到的结果为%d”,result); //8
@implementation CalculatorTools- (instancetype) init { self != [super init] ; if  { return nil; } self.result = 0; return self;}- (CalculatorTools *(NSInteger num)) add { return ^id(NSInteger num){ self.result  = num; return self; };}- (CalculatorTools *(NSInteger num)) minus{ return ^id(NSInteger num){ self.result -= num; return self; };}- (CalculatorTools *(NSInteger num)) multiply{ return ^id(NSInteger num){ self.result *= num; return self; };}- (CalculatorTools *(NSInteger num)) divide { return ^id(NSInteger num){ // 使用断言NSAssert()调试程序错误 NSAssert(num != 0, @"除数不能为零"); self.result /= num; return self; };}@end

animate 具体实现

- (JHChainableAnimation)animate
{
    JHChainableAnimation chainable = JHChainableAnimation(t) {

        return self.animateWithCompletion(t, self.completionBlock);
    };

    return chainable;
}

可能我们那大部分都会那样写的啊,但思考能或无法再把代码简练一些吗

接下去正是调用 :

金壁辉煌的分水线

认为到温馨的言语表示技术至极,猛然不知底该怎么往下说下去了。
以此地方。

双重描述下:

第一是像

- (JHChainableFloat)moveX;
- (JHChainableFloat)moveY;
- (JHChainablePoint)moveXY;
- (JHChainableFloat)moveHeight;
- (JHChainableFloat)moveWidth;

那类方法调用的时日,会扭转一些类的卡通对象 JHKeyframeAnimation 然后存款和储蓄到 JHAnimationChainLink 的卡通数组里面。

最终 animate 方法是循环调用 类数组里面储存的 JHAnimationChainLink 对象,执行 JHAnimationChainLink 对象的 JHKeyframeAnimation动漫片数组。
大概正是如此实行的,不过现实的得以达成有一些不清细节,动漫的充足,动漫实行的回调,取稳当前实施的动漫片、怎样暂停动漫等。以为温馨近来的功力还很难描述清楚。就临时先告一段落了。

比如
int result = [[maker add:10] sub:2].result;

本文由澳门威利斯人发布于澳门威利斯人,转载请注明出处:【奥门威尼人】iOS链式语法的实现,C中链式编程

关键词: Tips 语法 随笔 IOS iOS开发