oc中的block在不同的位置存在很多變形, 經(jīng)常容易搞暈,尤其是不經(jīng)常使用block的小伙伴龙助,想試用block, 但定義太復(fù)雜了砰奕,寫不好就寫不下去。
本文在使用block的幾個地方梳理了一下, 如typedef提鸟, @property中, 方法內(nèi)部定義一個臨時的block, 作為函數(shù)形參, 作為函數(shù)實(shí)參等脆淹。
主要的格式如下
block的變量定義:
返回值類型(^block變量名)(參數(shù)1類型, 參數(shù)2類型,參數(shù)n類型...)
BOOL(^block3)(int, NSString *)
block的實(shí)現(xiàn)(也就是block變量的值)格式:
^返回值類型(參數(shù)1類型, 參數(shù)2類型沽一,參數(shù)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變量名)(參數(shù)1類型, 參數(shù)2類型盖溺,參數(shù)n類型...)
和定義在方法中的格式是一樣的
@property (copy, nonatomic) BOOL(^block1)(int, NSString *);
在typedef中的格式:
返回值類型(^block類型名)(參數(shù)1類型, 參數(shù)2類型,參數(shù)n類型...)
就是把普通block變量類型定義的變量名的位置換成了類型名铣缠,注意類型名建議要大寫
typedef void(^RequestResult) (int, NSDictionary *);
// 使用typedef定義的block
@property (copy, nonatomic) RequestResult block2;
block在形參中的使用格式:
(返回值類型(^)(參數(shù)1類型, 參數(shù)2類型烘嘱,參數(shù)n類型...) )block變量名
在形參中的形式非常奇葩昆禽,和前面的格式相差較大。
可以看做是把普通block變量定義中的變量名拿出來, 然后整個添加一個()蝇庭,然后把變量名放在后面醉鳖。
- (void)testBlock: (BOOL(^)(int, NSString *))block {
block(18, @"xiaoli");
}
block在是實(shí)參中的使用格式:
^返回值類型(參數(shù)1類型, 參數(shù)2類型,參數(shù)n類型...) {
// 代碼
}
和block實(shí)現(xiàn)(值)的格式是完全一致的
[self testBlock:^BOOL(int age, NSString * name) {
NSLog(@"blockName: func_block, age: %d, name: %@", age, name);
return YES;
}];
block的調(diào)用格式:
block變量名(實(shí)參1哮内, 實(shí)參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);
運(yùn)行結(jié)果
DEMO Github地址:
https://github.com/gerrywg/blockDemo/tree/master