本篇博客, 跟大家分享一下实现 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
#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 对于属性是支持点语法的.
同理, 你也可以再定义其他带单参数的方法.这里不再赘述.
完整工程请移步. -------->>