XZ_iOS之函数式编程和链式编程

// 函数式编程 : 对象调用方法 , 返回这个对象本身 , 然后再去调用另一个方法 , 调用完返回的还是这个对象本身 .
// 链式编程 : 通过 语法去调用方法,使用 ’()‘ block 的方式调用方法,如果要实现函数式编程,需要返回 'block'

  // masonry 是函数式编程和链式编程的 经典代表
    UIView *view = [[ UIView alloc ] init ];
    view. backgroundColor = [ UIColor blueColor ];
    [ self . view addSubview :view];
    [view mas_makeConstraints :^( MASConstraintMaker *make) {
        make. top . equalTo ( self . view ). offset ( 40 );
        make. size . mas_offset (CGSizeMake( 100 , 100 ));
        make. centerX . equalTo ( self . view ). offset (- 40 );
    }];

XZPeson.h中
@interface XZPersonA : NSObject
// person 类中定义两个方法
- ( void )run;
- ( void )eat;

// person 类中定义两个方法,返回对象本身
- ( XZPersonA *)run1;
- ( XZPersonA *)eat1;


// Person 类中定义两个方法,返回值是不带参数的 block block 的返回值是对象本身
- ( XZPersonA *(^)())run2;
- ( XZPersonA *(^)())eat2;

// Person 类中定义两个方法,返回值是带参数的 block block 的返回值是对象本身
- ( XZPersonA *(^)( double distance))run3;
- ( XZPersonA *(^)( NSString *food))eat3;

@end

XZPeson.m中
#import "XZPersonA.h"

@implementation XZPersonA

// person 类中定义两个方法
- ( void )run {
    NSLog ( @"%s" , __FUNCTION__ );
}

- ( void )eat {
    NSLog ( @"%s" , __FUNCTION__ );
}

// person 类中定义两个方法,返回对象本身
- ( XZPersonA *)run1 {
    NSLog ( @"%s" , __FUNCTION__ );
    return self ;
}
- ( XZPersonA *)eat1 {
    NSLog ( @"%s" , __FUNCTION__ );
    return self ;
}

// Person 类中定义两个方法,返回值是不带参数的 block block 的返回值是对象本身
- ( XZPersonA * (^)())run2 {
    // 因为返回值是一个 block ,所以我们需要定义一个 block ,因为要返回值是对象本身,所以在这个 block 的内部实现中返回这个对象本身;
    XZPersonA * (^runBlock)() = ^{
        return self ;
    };
    NSLog ( @"%s" , __FUNCTION__ );
    return runBlock;
}

- ( XZPersonA * (^)())eat2 {
    XZPersonA *(^eatBlock)() = ^() {
        return self ;
    };
    NSLog ( @"%s" , __FUNCTION__ );
    return eatBlock;
}

// Person 类中定义两个方法,返回值是带参数的 block block 的返回值是对象本身
- ( XZPersonA *(^)( NSString *food))eat3 {
//    XZPersonA *(^eatBlock)(NSString *food) = ^(NSString *foods) {
//        return self;
//    };
//    return eatBlock;
// 
    return ^( NSString *food) {
        NSLog ( @" %@" ,food);
        return self ;
    };
}

- ( XZPersonA *(^)( double distance))run3 {
    // 方法的返回值是一个 block ,这个 block 的返回值是类本身
    return ^( double distance) {
        NSLog ( @" %.2f 千米 " ,distance);
        return self ;
    };
}

@end

XZFunAndChainProController.m中
//  函数式编程和链式编程

#import "XZFunAndChainProController.h"
#import "XZPersonA.h"

@interface XZFunAndChainProController ()

@end

@implementation XZFunAndChainProController

- ( void )viewDidLoad {
    [ super viewDidLoad];

    // Person 类中定义两个方法,传统方法调用 , 两个方法需要单独调用 , 也不能任意组合顺序
    XZPersonA *person = [[XZPersonA alloc] init];
    [person run];
    [person eat];
   
    // 链式编程目标是 [[person run1] eat2] ,如果想要实现这个目标, [person run1] 调用完毕就要返回 person 这个对象本身
   
    // 所以,在 Person 类中定义两个方法,返回对象本身
    [[person run1] eat1];
    [[person eat1] run1];
   
    // 函数式编程的目标是 person.run2().eat2() OC 中使用 ‘()’ 的地方是什么呢?执行 block 的时候需要 () ,所以,如果要实现函数式编程,需要返回 'block'
    // Person 类中定义两个方法,返回值是不带参数的 block,block 的返回值是对象本身
    person.run2().eat2();
    person.eat2().run2();
   
    // Person 类中定义两个方法,返回值是带参数的 block,block 的返回值是对象本身
    person.run3( 3.5 ).eat3( @" 食物 " );
    person.eat3( @" 食物 " ).run3( 3.5 );
}

@end

该方法的返回值是带参数的block,block的返回值是对象本身


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值