oc block在不同位置的写法格式

2022-03-06  本文已影响0人  gerrywanggang

oc中的block在不同的位置存在很多变形, 经常容易搞晕,尤其是不经常使用block的小伙伴,想试用block, 但定义太复杂了,写不好就写不下去。
本文在使用block的几个地方梳理了一下, 如typedef, @property中, 方法内部定义一个临时的block, 作为函数形参, 作为函数实参等。

主要的格式如下

block的变量定义:

返回值类型(^block变量名)(参数1类型, 参数2类型,参数n类型...)

BOOL(^block3)(int, NSString *) 

block的实现(也就是block变量的值)格式:

^返回值类型(参数1类型, 参数2类型,参数n类型...) {
// 代码
}

^BOOL(int age, NSString * name) {
        NSLog(@"blockName: block3, age: %d, name: %@", age, name);
        return YES;
    };
BOOL(^block3)(int, NSString *) = ^BOOL(int age, NSString * name) {
        NSLog(@"blockName: block3, age: %d, name: %@", age, name);
        return YES;
    };

在property中的格式:

返回值类型(^block变量名)(参数1类型, 参数2类型,参数n类型...)
和定义在方法中的格式是一样的

@property (copy, nonatomic) BOOL(^block1)(int, NSString *);

在typedef中的格式:

返回值类型(^block类型名)(参数1类型, 参数2类型,参数n类型...)
就是把普通block变量类型定义的变量名的位置换成了类型名,注意类型名建议要大写

typedef void(^RequestResult) (int, NSDictionary *);
// 使用typedef定义的block
@property (copy, nonatomic) RequestResult block2;

block在形参中的使用格式:

(返回值类型(^)(参数1类型, 参数2类型,参数n类型...) )block变量名
在形参中的形式非常奇葩,和前面的格式相差较大。
可以看做是把普通block变量定义中的变量名拿出来, 然后整个添加一个(),然后把变量名放在后面。

- (void)testBlock: (BOOL(^)(int, NSString *))block {
    block(18, @"xiaoli");
}

block在是实参中的使用格式:

^返回值类型(参数1类型, 参数2类型,参数n类型...) {
// 代码
}
和block实现(值)的格式是完全一致的

[self testBlock:^BOOL(int age, NSString * name) {
        NSLog(@"blockName: func_block, age: %d, name: %@", age, name);
        return YES;
    }];

block的调用格式:

block变量名(实参1, 实参2, ...);

BOOL result1 = self.block1(18, @"block1");
    self.block2(18, @{@"url": @"https://www.baidu.com"});
    BOOL result3 = block3(18, @"block3");
    [self testBlock:^BOOL(int age, NSString * name) {
        NSLog(@"blockName: func_block, age: %d, name: %@", age, name);
        return YES;
    }];
    NSLog(@"result1: %d, result3: %d", result1, result3);

运行结果


image.png

DEMO Github地址:
https://github.com/gerrywg/blockDemo/tree/master

上一篇 下一篇

猜你喜欢

热点阅读