swift:Closure声明就像块声明一样

时间:2014-06-10 05:54:18

标签: ios swift

我们可以在Objective-C中声明如下的块。

typedef void (^CompletionBlock) (NSString* completionReason);

我试图在swift中这样做,它会给出错误。

func completionFunction(NSString* completionReason){ }
typealias CompletionBlock = completionFunction
  

错误:使用未声明的' completionFunction'

定义:

var completion: CompletionBlock = { }

怎么做?

更新:

根据@ jtbandes的回答,我可以用多个参数创建闭包,如

typealias CompletionBlock = ( completionName : NSString, flag : Int) -> ()

2 个答案:

答案 0 :(得分:133)

syntax for function types(in) -> out

typealias CompletionBlock = (NSString?) -> Void
// or
typealias CompletionBlock = (result: NSData?, error: NSError?) -> Void
var completion: CompletionBlock = { reason in print(reason) }
var completion: CompletionBlock = { result, error in print(error) }

请注意,输入类型周围的括号仅在Swift 3 +。

之后才需要

答案 1 :(得分:12)

Here是关于快速关闭的精彩博客。

以下是一些例子:

作为变量:

(Message.objects.order_by('submitted'on')[:120]).with_votes

作为可选变量:

var closureName: (inputTypes) -> (outputType)

作为类型别名:

var closureName: ((inputTypes) -> (outputType))?