首页 > 代码库 > swift学习第十五天:闭包

swift学习第十五天:闭包

闭包

闭包的介绍

  • 闭包和OC中的block非常相似
    • OC中的block是匿名的函数
    • Swift中的闭包是一个特殊的函数
    • block和闭包都经常用于回调
  • 注意:闭包和block一样,第一次使用时可能不习惯它的语法,可以先按照使用简单的闭包,随着学习的深入,慢慢掌握其灵活的运用方法.

闭包的使用

block的用法回顾
  • 定义网络请求的类
@interface HttpTool : NSObject- (void)loadRequest:(void (^)())callBackBlock;@end@implementation HttpTool- (void)loadRequest:(void (^)())callBackBlock{    dispatch_async(dispatch_get_global_queue(0, 0), ^{        NSLog(@"加载网络数据:%@", [NSThread currentThread]);        dispatch_async(dispatch_get_main_queue(), ^{            callBackBlock();        });    });}@end
  • 进行网络请求,请求到数据后利用block进行回调
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{    [self.httpTool loadRequest:^{        NSLog(@"主线程中,将数据回调.%@", [NSThread currentThread]);
self.view.backgroundColor = [UIColor redColor]; }];}
  • block写法总结:
block的写法:    类型:    返回值(^block的名称)(block的参数)    值:    ^(参数列表) {        // 执行的代码    };
注意:在上述oc中的block中,在block语句块中设置self.view.backgroundColor = [UIColor redColor];不会产生循环引用,原因是,如图所示:
技术分享
控制器中属性定义HttpTool,则控制器会对
HttpTool有一个强引用,在block语句块中会对外部引用的变量产生一个强引用,所以block对控制器有一个强引用,但HttpTool不会对block产生一个强引用,所以没有形成闭环,不会产生循环引用。若是解决循环引用可以用:__weak typeof(self) weakSelf = self;typeof(self)意思是取self的类型,所以也可以:__weak vc *weakSelf = self。

 



swift学习第十五天:闭包