以下代码在 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/