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);
上一篇下一篇

猜你喜欢

热点阅读