zoukankan      html  css  js  c++  java
  • ios的链式编程笔记

    1.Masonry的语法为啥能连续的使用点语法? >> 底层使用的是:用block当函数的返回参数  > 链式编程思想

    2. 使用block当函数的返回参数

    // 之前开发中比较习惯,把事情封装到一个方法中,

    // 链式编程思想:把要做的事情封装到block,给外界提供一个返回这个Block的方法

    // 链式编程思想方法特点:方法返回值必须是block,block参数:放需要操作的内容,block返回值:方法调用者

    - (void)viewDidLoad {

        [super viewDidLoad];

        UIView *redView = [[UIView alloc] init];

        redView.backgroundColor = [UIColor redColor];

        [self.view addSubview:redView];

        void(^block)(MASConstraintMaker *maker) = ^(MASConstraintMaker *make) {

            // 描述控件的所有约束

            // 上下左右间距都为10

            // make.left 返回值-> MASViewConstraint

            // make.left.top:把左边和顶部的约束全部保存到make.contrains

            // equalTo:方法

            // equalTo返回值:block        

           id(^block)(id attribute) = ^id(id attribute) {

            //   return self.equalToWithRelation(attribute, N

            //   SLayoutRelationEqual);

               return nil;

           };

            block(@10);

            // equalTo(@10)返回值 =  self.equalToWithRelation(attribute, NSLayoutRelationE qual);

            make.left.top.equalTo(@10);

            make.right.bottom.equalTo(@(-10));

        };

        // 参数:block

        [redView mas_makeConstraints:^(MASConstraintMaker *make) {

            make.left.top.equalTo(@10);

            make.right.bottom.equalTo(@(-10));

        }];

        // mas_makeConstraints作用给控件设置布局把控件的所有约束保存到约束制造者中.

        // - (NSArray *)mas_makeConstraints:(void(^)(MASConstraintMaker *))block

        // 1.创建一个约束制造者

        // 2.调用block(maker),把所有的控件的约束全部保存到约束制造者

        // 3.[constraintMaker install]:遍历约束制造者的所有约束给控件添加约束

    }

    计算加法为例: 

     1.创建一个计算者的类

    - (CaculatorMaker * (^)(int num))add

    {

        return ^(int num){

                 _result += num;

                   return self;

        };

    }

    2.写一个继承NSObject的类 仿Masonry的方法写一个自己的方法:+ (int)makeCaculator:(void (^)(CaculatorMaker *))block

    #import "NSObject+Caculator.h"

     

    #import "CaculatorMaker.h"

     

    @implementation NSObject (Caculator)

    + (int)makeCaculator:(void (^)(CaculatorMaker *))block

    {

        // 创建计算制造者

        CaculatorMaker *maker = [[CaculatorMaker alloc] init];

        // 计算

        block(maker);

        return maker.result;

    }

    @end

    3. 直接使用链式编程

    - (void)viewDidLoad {

        [super viewDidLoad];

        // Do any additional setup after loading the view, typically from a nib.

        // add(1).add(2)

        // 1.创建计算制造者

        CaculatorMaker *maker = [[CaculatorMaker alloc] init];

        // 10 + 20 + 30 + 40

        // 链式编程思想: maker.add(10).add(20).add(30).add(40)

        // int result = [maker.add(10).add(20).add(30).add(40) result];

        

        //   提供一个没参数的add方法,返回值block

        //   int reslut = [[[[[maker add:10] add:20] add:30] add:40] result];

        //   block:使代码高聚合

        int result = [NSObject makeCaculator:^(CaculatorMaker *maker) {

        // 把所有的计算代码封装到这里 

            maker.add(10).add(20);

            maker.add(30).add(40);   

            maker.multy(3); 

        }];

        NSLog(@"%d",result);

    }

     

    总结:用Block实现链式编程无非就是:方法的返回值是一个Block,

    Block内部装着真正要执行的方法,Block内部再返回self;

         如果有参数,通过Block的参数往里传.

    - ( 返回值是Block ) 方法名

    {

        return *{

          Block内部装着真正要执行的代码

          return self;

        };

    }

  • 相关阅读:
    [Python]计算豆瓣电影TOP250的平均得分
    [Golang]使用自建代理访问指定网站
    HDU 2689.Sort it-冒泡排序
    HDU 1728.逃离迷宫-BFS
    hihoCoder #1498.Diligent Robots
    POJ 2503.Babelfish-sscanf()函数+strcmp()函数+二分
    Codeforces 608 B. Hamming Distance Sum-前缀和
    Codeforces 608 A. Saitama Destroys Hotel
    sscanf()函数
    UVA 11461.Square Numbers
  • 原文地址:https://www.cnblogs.com/supersr/p/5275464.html
Copyright © 2011-2022 走看看