IOS_编程思想_Block
2017-10-30 本文已影响9人
_CLAY_
开启苹果自带的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);