OC实战: ARC 下使用 Block 实现链式语法

本篇博客, 跟大家分享一下实现 objective-c 的链式语法.

-----------------------------------------------------------------

主要内容

1. 基于 ARC.

2. 使用 Objective-c 语言编写.

3. 使用 block 实现.

-----------------------------------------------------------------

在其他语言中类似如下的语法,不足为奇.

A(10).B.C("string").D();


这种调用方式被称之为链式调用, 也就是今天我们要说的链式语法.


在 Objective-c 中

[self forkChild:(@"")].doSomthing;

这种使用也是颇见.

那么我们今天讨论的不是上述[...].***的调用方式.


可能你会说, 实现类似 a.b.c...的调用也很简单啊.不信你看:

Driver.h

#import <Foundation/Foundation.h>

@interface Driver : NSObject

- (void)driveCar;

- (instancetype)with;

@end


Driver.m

#import "Driver.h"

@implementation Driver

- (void)driveCar
{
    
}

- (instancetype)with
{
    return self;
}

@end

with 方法返回 self, 类似 java 或 c++ 的 return this.

main.m

#import <Foundation/Foundation.h>
#import "Driver.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Driver *driver = [[Driver alloc] init];
        
        // ok
        [driver.with driveCar];
        
        // error
        //[driver.with.driveCar];
       //warn
        //[driver.with.driveCar;
    }
    
    return 0;
}



可以看出无法形成链式语法.如果方法有参数的话, 实现起来就更加麻烦.

ok, 进入今天主题.

---------------------------------------------------------------------------

一. 新建工程

* xcode 的 mac osx / Application/ Command Line Tool.

* 工程名称为 ChainingOSX.


二. 新建类文件

Driver.h

#import <Foundation/Foundation.h>

@interface Driver : NSObject

//- (instancetype)driveCar;

- (Driver *(^)(void))driverCar;

- (instancetype)with;

@end

Driver.m

#import "Driver.h"

@implementation Driver

- (Driver *(^)(void))driverCar
{
    return ^(void) {
        
        // do something
        
        NSLog(@"driverCar...");
        
        return self;
    };
}

- (instancetype)with
{
    NSLog(@"with...");
    
    return self;
}

@end

可能你比较迷惑

- (Driver *(^)(void))driverCar
{
    return ^(void) {
        
        // do something
        
        NSLog(@"driverCar...");
        
        return self;
    };
}

后面再说这个问题.

我们看看调用方 main.m

#import <Foundation/Foundation.h>
#import "Driver.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Driver *driver = [[Driver alloc] init];
        driver.with.driverCar();
    }
    
    return 0;
}

刚才上面说到的问题, 熟悉 oc 的同学应该可以看出这个就是一个 block.

我把 Driver.h 修改一下, 你就会看的更明白.

#import <Foundation/Foundation.h>

@interface Driver : NSObject

@property (copy, nonatomic, readonly) Driver *(^driverCar)(void);

//- (instancetype)driveCar;

- (Driver *(^)(void))driverCar;

- (instancetype)with;

@end


这样, driverCar 就成为了 Driver 的一个属性成员了.

这样 oc 对于属性是支持点语法的.

同理, 你也可以再定义其他带单参数的方法.这里不再赘述.


完整工程请移步. -------->>


©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页