Block & Closures

不管是Block还是Closure在编码过程中都极大的改善了代码的结构,使其更为紧凑,其值捕获的特性更是方便,下面记录一下各类使用方法

Block

本地变量

returnType (^blockName)(parameterTypes) = ^returnType(parameterTypes){...};

属性

@property (nonatomic, copy, nullablility) returnType (^blockName)(parameterTypes);

方法的参数

- (void)someMethod:(returnType (^nullability)(parameterTypes))blockName

调用方法的参数

[someObject someMethod:^returnType(parameterTypes){...}];

宏定义

// 定义
typedef returnType (^TypeName)(parameterTypes);
// 调用
TypeName blockName = ^returnType(parameterTypes) {...};

关于Block内存管理,有出门左转,看楼主之前的这篇文章

Closure

变量

var closureName: (ParameterTypes) -> (ReturnType)

常量

let closureName: ClosureType = {...}

可选值

var closureName: ((ParameterTypes) -> (ReturnType))?

别名定义

typealias ClosuerType = (ParameterTypes) -> (ReturnType)

作为函数的调用参数

func({ (ParameterTypes) -> (ReturnType) in statements })

函数参数

array.sort({ (item1: Int, item2: Int) -> Bool in return item1 < item2 })

隐式类型函数参数,这种写法利用了swift的类型推断特性

array.sort({ (item1, item2) -> Bool in return item1 < item2 })

省略返回值写法

array.sort({ (item1, item2) in return item1 < item2 })

尾闭包写法,当闭包作为函数的最后一个参数的时候,可以使用尾闭包写法

array.sort{ (item1, item2) in return item1 < item2 }

尾闭包简写

array.sort{ return $0 < $1}
array.sort{ $0 < $1 }
array.sort{ < } // swift中的符号其实是一个函数

当有值捕获的时候注意循环引用

array.sort( { [unowned self] (item1: Int, item2: Int) -> Bool in return item1 < item2 } )

优化写法

array.sort{ [unowned selft] in return item1 < item2 }

关于Closure内存管理,有出门右转,看楼主之前的这篇文章

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 86.复合 Cases 共享相同代码块的多个switch 分支 分支可以合并, 写在分支后用逗号分开。如果任何模式...
    无沣阅读 5,293评论 1 5
  • 以下翻译自Apple官方文档,结合自己的理解记录下来。翻译基于 swift 3.0.1 原文地址 Closure...
    艺术农阅读 5,525评论 0 3
  • 题目: 当代风采人物评选活动已产生最后三名候选人,老李,笃学敏思,矢志创新,为破解生命科学之谜做出重大贡献,率领团...
    wwwbb阅读 2,372评论 0 1
  • 第五话 杀人游戏 时间,以它难以察觉的姿态悄悄地进行着。现在,已经是秋季了。街道上飘扬着刚刚枯萎的落叶,那淡淡的风...
    邹航阅读 1,683评论 0 1
  • 鼻塞、声嘶、头痛,症状很明显。一直感觉偏头疼但确实摁着不痛。哦,明白了,有一种痛叫内伤。这样一个不眠之夜,我想起了...
    雪输梅香01阅读 3,184评论 2 7