不管是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内存管理,有出门右转,看楼主之前的这篇文章