1. 程式人生 > >OC實戰: ARC 下使用 Block 實現鏈式語法

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 對於屬性是支援點語法的.

同理, 你也可以再定義其他帶單引數的方法.這裡不再贅述.