開啟蘋果自帶的block代碼塊:
輸入inlineBlock開啟蘋果自帶的block代碼塊
<#returnType#>(^<#blockName#>)(<#parameterTypes#>) = ^(<#parameters#>) {
<#statements#>
};
舉個例子
void(^BC_Block)() = ^() {
NSLog(@"我是一個block");
};
BC_Block();
當返回值為id類型的時候,所定義的值也必須將類型寫上,否則會報錯如下所示!
image.png
正確的寫法:
image.png
由此可見,蘋果自帶的block代碼塊并不是完整的!
將完整的Block添加到代碼塊:
<#returnType#>(^<#blockName#>)(<#parameterTypes#>) = ^<<#returnType#>>(<#parameters#>) {
<#statements#>
};
Xcode 9.0.1 鼠標左鍵長按1秒,拖拽到右側的代碼塊列表中
Xcode 9.0.1 以前的可以直接拖拽到右側的代碼塊列表中
Block開發中的使用場景:
準備工作:
先定義一個Person類
Person.h
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property (nonatomic,copy) void(^run)(void);
-(void)eat:(void(^)(void))block;
-(Person *(^)(int))write;
@end
Person.m
#import "Person.h"
@implementation Person
-(void)eat:(void (^)(void))block {
NSLog(@"Person里面調用Block");
block();
}
-(Person *(^)(int x))write {
// self是方法調用者!!
return ^Person *(int x) {
NSLog(@"我寫到%d頁",x);
return self;
};
}
@end
ViewController.m
@interface ViewController ()
@property (nonatomic,strong) Person *p;
@end
1.Block作為屬性.在合適的時候調用方法
Person *p = [[Person alloc] init];
p.run = ^{
NSLog(@"執行對象中的Block");
};
_p = p;
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
_p.run();
}
2.Block作為參數.外界不調用,留給內部調用
[p eat:^{
NSLog(@"吃東西");
}];
3.Block作為返回值
void(^block)(void) = p.write;
block(1000);
等同于
p.write(1000);
優點:1.可讀性強
2.擴展性 ---- 鏈式編程
p.write(100).write(200).write(300);