swift - 为什么在 Swift 的单数 return 表达式中使用闭包速记变量必须是详尽无遗的?

标签 swift swift3 closures

以下代码在 Swift 中是错误的。

func foo(closure: (Int, Int) -> Int) -> Int {
    return closure(1, 2)
}

print(foo(closure: {$0}))

func foo(closure: (Int, Int) -> Int) -> Int {
    return closure(1, 2)
}

print(foo(closure: {return $0}))

XCode playground 给出的错误是 Cannot convert value of type '(Int, Int)' to closure result type 'Int'

虽然下面的代码完全没问题。

func foo(closure: (Int, Int) -> Int) -> Int {
    return closure(1, 2)
}

print(foo(closure: {$0 + $1}))

func foo(closure: (Int, Int) -> Int) -> Int {
return closure(1, 2)
}
print(foo(closure: {$1; return $0}))

func foo(closure: (Int, Int) -> Int) -> Int {
    return closure(1, 2)
}

print(foo(closure: {a, b in a}))

似乎在闭包的参数由速记参数名称引用的情况下,如果闭包的主体仅由返回表达式组成,则必须详尽地使用它们。为什么?

最佳答案

如果你只使用$0,闭包参数被假定为一个元组而不是多个变量$0$1等。所以你应该能够通过提取该元组的第一个值来解决这个问题:

print(foo(closure: {$0.0}))

关于swift - 为什么在 Swift 的单数 return 表达式中使用闭包速记变量必须是详尽无遗的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43035187/

相关文章:

ios - 获取 UITableView 每一行的高度

ios - 为选择 View Controller 创建导航栏标题图像会产生奇怪的行为

core-data - Xcode 8 中的核心数据代码生成失败

ios - 将扩展转换为类的函数

ios - FBSDKLoginKit 在登录和确认页面后不会重定向我的应用程序

JavaScript 闭包和名称破坏

ios - 如何修复上下文闭包类型 '((String, JSON), (String, JSON)) -> Bool' 需要 2 个参数,但在闭包主体中使用了 1 个?

swift - 将接受闭包的函数转换为接受函数

Swift - 从服务器上的特定文件夹/远程 URL 中获取所有文件

ios - Uber 在 ios Swift 中提供了无效的 OAuth 2.0 凭据 Uber 身份验证