OC實戰: ARC 下使用 Block 實現鏈式語法
阿新 • • 發佈:2019-02-14
本篇部落格, 跟大家分享一下實現 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 對於屬性是支援點語法的.
同理, 你也可以再定義其他帶單引數的方法.這裡不再贅述.