我们可以在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) -> ()
答案 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))?