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

你可能感兴趣的:(Block & Closures)