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

Man*_*ani 89 ios swift

我们可以在Objective-C中声明如下所示的块.

typedef void (^CompletionBlock) (NSString* completionReason);
Run Code Online (Sandbox Code Playgroud)

我试图在swift中做到这一点,它给出了错误.

func completionFunction(NSString* completionReason){ }
typealias CompletionBlock = completionFunction
Run Code Online (Sandbox Code Playgroud)

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

定义:

var completion: CompletionBlock = { }
Run Code Online (Sandbox Code Playgroud)

这该怎么做?

更新:

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

typealias CompletionBlock = ( completionName : NSString, flag : Int) -> ()
Run Code Online (Sandbox Code Playgroud)

jtb*_*des 139

函数类型语法(in) -> out.

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

请注意,输入类型周围的括号仅在Swift 3+时需要.

  • @jtbandes它正在运作.我用两个参数创建了`typealias CompletionBlock =(completionName:NSString,flag:Int) - >()` (4认同)

BLC*_*BLC 13

是关于快速关闭的精彩博客.

这里有些例子:

作为变量:

var closureName: (inputTypes) -> (outputType)
Run Code Online (Sandbox Code Playgroud)

作为可选变量:

var closureName: ((inputTypes) -> (outputType))?
Run Code Online (Sandbox Code Playgroud)

作为类型别名:

typealias closureType = (inputTypes) -> (outputType)
Run Code Online (Sandbox Code Playgroud)