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

本文介绍如何在Objective-C中实现链式语法调用。通过使用Block和自定义方法返回类型,可以创建类似Java或C++中流畅的链式调用。文章提供了具体的代码示例并解释了其工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本篇博客, 跟大家分享一下实现 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 对于属性是支持点语法的.

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


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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值