iOS开发学习48 OC的lambda block

Posted 编程圈子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS开发学习48 OC的lambda block相关的知识,希望对你有一定的参考价值。

ios开发学习48 lambda表达式

一、block 简介

Block是苹果在ObjectC为C、C++以及Objective-C添加的特性,使得这些语言可以用类lambda表达式的语法来创建闭包。
block不需要写protocol、函数等、注重结果的传输,写法比委托简便。
block的声明:

<返回值类型> + (^<block名字>) + (<参数类型1>, <参数类型2>...)

二、block使用

1. block的写法大概就是这样:

void (^blockTest)(void) = ^
    NSLog(@"block");
;

blockTest();

2. 带参数的话可以这样写:

^ BOOL (int left, int right)
	return a > b;


3. 如果不写入参,可以写:

    (void)^
        NSLog(@"block的使用");
    ;

4. 当然返回也可以省略,不过编译器可能会有警告:

    ^
        NSLog(@"最简捷的block的使用");
    ;

5. 定义一个block的变量:

    void (^blockWithParm)(int parm) = ^(int count)
        NSLog(@"有参无返回值的定义和使用:%d", count);
    ;
    blockWithParm(100);

6. block就可以作为另一个函数的参数

void a()
    void (^block)(int parm) = ^(int count)
        NSLog(@"有参无返回值的定义和使用:%d", count);
    ;
    // 把block 传到funcWithParm里作为参数
    funcWithParm(block);


void funcWithParm(void (^block)(int parm))

    block(10);

7. block 作为类的属性(使用typedef)

在头文件中定义

typedef void (^blockTest)(); 
@property (nonatomic,copy) blockTest myblock;  

在m文件中调用:

if(_myblock)
_myblock();

其它类使用该属性

_testClass.myblock = ^
 NSLog(@"block");


8. 类的方法里使用block

头文件

+(void) myfunc:(int)someParam myBlock:(nonnull void(^)(NSString* _Nonnull))myBlock;

m文件

+(void) myfunc:(int someParam myBlock:(nonnull void(^)(NSString* _Nonnull))myBlock
    ... some code
    NSString* ret = @"return value";
    myBlock(ret);

三、OC自带的使用block的API示例

遍历元素

    NSArray *arrChar=[@"A/B/C/D/E/F" componentsSeparatedByString:@"/"];
    //遍历元素
    [arrChar enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) 
        NSLog(@"\\nindex:[%d], value:[%@]",idx,obj);
        if(idx == 4)
        
            *stop=YES;
        
    ];

以上是关于iOS开发学习48 OC的lambda block的主要内容,如果未能解决你的问题,请参考以下文章

小白学开发(iOS)OC_ block数据类型(2015-08-08)

[OC学习笔记]Block三种类型

iOS开发系列-Block本质篇

32-oc block

高效 OC开发之Block和GCD

iOS OC语言: Block底层实现原理