Day 07- Blocks

Objective-C class 定义一个物件(object),该物件含有资料和一些行为。有时可能只是些简单的任务或行为单元,而不是一个方法。类似於Swift closure

此时可以使用 Blocks,它可以创建不同的 code 片段,这些片段像值(value)一样传给方法。

Blocks 是 Objective-C objects,这意味着它们可以被加到像 NSArray 或 NSDictionary 中。

简单的 Block 声明语法

returntype (^blockName)(argumentType);

简单的 Block 执行(implementation)

returntype (^blockName)(argumentType)= ^{
};

ex.

void (^simpleBlock)(void) = ^{
   NSLog(@"This is a block");
};

调用

simpleBlock();

Blocks 带参数跟返回值

这是一个简单的范例,用来实现和调用带有参数与返回值的 block

int (^add) (int, int) = ^ (int num1, int num2){
    return num1 + num2;
};

int addValue = add(2,4);    
NSLog(@"addValue值为:%d",addValue);

Blocks 使用类型定义(Type Definitions)

有点类似Swift @escaping的概念,以下有个简单范例:

#import <Foundation/Foundation.h>

// Block
typedef void (^CompletionBlock)();

@interface SampleClass : NSObject

- (void)actionWithCompletion:(CompletionBlock)completionBlock;

@end

@implementation SampleClass

- (void)actionWithCompletion:(CompletionBlock)completionBlock {
    
    NSLog(@"123123");
    completionBlock();
}

@end


int main () {
        
    SampleClass *sampleClass = [[SampleClass alloc] init];
    
    [sampleClass actionWithCompletion:^{
            NSLog(@"测试成功");
        }];
    
    return 0;
}

结果:

2021-09-25 01:30:12.513299+0800 TestOC[42625:1157919] 123123
2021-09-25 01:30:12.513847+0800 TestOC[42625:1157919] 测试成功

如果类型定义带有参数的话...

import <Foundation/Foundation.h>

// block有两个类型为 string 的参数
typedef void (^CompletionBlock)(NSString *str1,NSString *str2);

@interface SampleClass : NSObject

- (void)actionWithCompletion:(CompletionBlock)completionBlock;

@end

@implementation SampleClass

- (void)actionWithCompletion:(CompletionBlock)completionBlock {
    
		//前为 str1, 後为 str2, 有先後之分
    completionBlock(@"tom",@"iOS developer");
}

@end

int main () {
        
    SampleClass *sampleClass = [[SampleClass alloc] init];
    
    [sampleClass actionWithCompletion:^(NSString *str1, NSString *str2) {
        NSLog(@"我是 %@,职位: %@",str1,str2);
    }];
    
    return 0;
}

结果:

2021-09-25 01:36:01.848974+0800 TestOC[42683:1162447] 我是 tom,职位: iOS developer

<<:  Day 0x18 UVa10415 Eb Alto Saxophone Player

>>:  [Day-16] 阵列

[Day15] App Engine

今天要来介绍 Google Cloud 中的 App Engine,App Engine 是一款 P...

久坐是门学问 - 人因工程

来到了办公桌座位,打开电脑萤幕,拿起滑鼠准备查阅未开封的信件,开始一天的早晨。这一整段过程看似简单,...

作为CISO最关键的任务-开发资讯安全性管理系统

在这四个选项中,开发信息安全管理系统(ISMS)是最合适,最关键的。ISMS从管理承诺和政策开始,这...

使用 Domain Driven Design 来进行架构设计

接续上一篇的故事,阿明跟小美又经过了几次的对话与讨论,在便利贴专案中整理归纳了下列这几个关键字: C...

Date & time

上一篇在实作 EtaResponseMapper 的时候我们用了 Java 8 开始有的 Insta...