闭包返回类型语法

时间:2016-04-24 19:33:57

标签: swift closures

我在结构中有以下闭包导致一些混淆。

var response: (result: Result<UserInfo>) -> Void

struct RegisterRequest: Requestable 
{
    let userInfo : [String:AnyObject]
    var response: (result: Result<UserInfo>) -> Void
}

现在,当我尝试实现它时,我有以下内容:

let register = RegisterRequest(userInfo: userInfo, response: { (result) in
})

如果闭包语法是

{ (params) -> returnType in 
   statements
}

为什么swift会自动将我的实施更正为(result) in而不是(Void) in

2 个答案:

答案 0 :(得分:2)

块变量response应该采用类型为Result的单个参数,而不是Void()。因此,Xcode自动填充一个名为result的参数,表示Result个对象。由于返回类型为Void,因此->之后的任何内容都可以省略。

更明确地说,它将被写为:

..., response: { (result: Result<UserInfo>) -> Void in
})

为简单起见,它转换为:

..., response: { (result) in
})

参数括号也可以省略:

..., response: { result in
})

或更好的trailing closure syntax

RegisterRequest(userInfo: userInfo) { result in
  ...
}

如果您不希望块采用任何参数,您可以将其类型定义为以下之一:

var response: (Void) -> Void
var response: () -> Void

答案 1 :(得分:0)

您可能会误解闭包参数不是返回类型。

struct RegisterRequest: Requestable 
{
    let userInfo : [String:AnyObject]
    var response: (result: Result<UserInfo>) -> Void
}

let register = RegisterRequest(userInfo: userInfo, response: { (result) in

})

让我们添加一些可能更清晰的参数。

struct RegisterRequest: Requestable 
{
    let userInfo : [String:AnyObject]
    var response: (result: Result<UserInfo>, myparam1: Int) -> Void
}

let register = RegisterRequest(userInfo: userInfo, response: { (result, p1) in

})

再次:

struct RegisterRequest: Requestable 
{
    let userInfo : [String:AnyObject]
    var response: (result: Result<UserInfo>, myparam1: Int, myparam2: String) -> Void
}

let register = RegisterRequest(userInfo: userInfo, response: { (result, p1, p2) in

})

您会注意到不必指定类型,因为它已经知道。

参数名称,不必与原始声明匹配。在我的例子中,myparam1在闭包中显示为p1。