我在结构中有以下闭包导致一些混淆。
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
答案 0 :(得分:2)
块变量response
应该采用类型为Result
的单个参数,而不是Void
或()
。因此,Xcode自动填充一个名为result
的参数,表示Result
个对象。由于返回类型为Void
,因此->
之后的任何内容都可以省略。
更明确地说,它将被写为:
..., response: { (result: Result<UserInfo>) -> Void in
})
为简单起见,它转换为:
..., response: { (result) in
})
参数括号也可以省略:
..., response: { result in
})
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。