有一个功能:
func (first: Int) -> Int -> Bool -> String {
return ?
}
如何写回程值? 我对上面的func的返回类型非常困惑。
答案 0 :(得分:9)
在解析函数/闭包返回时从右到左阅读。右边最右边的是返回类型,你可以将其余的放在括号中。
因此,您的函数声明等同于
func (first: Int) -> ((Int) -> ((Bool) -> String))
和
func (first: Int)(_ second: Int)(_ third: Bool) -> String
虽然Swift 3.0将不再支持此表单(感谢@Andrea的提升)。
这称为function currying。函数返回一个以Int
为参数的函数,并返回另一个函数,该函数将Bool
作为参数并返回String
。这样你就可以轻松连锁
函数调用。
因此,方法体必须返回列表中的第一个函数,该函数具有以下签名:
func ((Int) -> ((Bool) -> String))
然后你可以这样称呼它:
f(1)(2)(true)
答案 1 :(得分:2)
让我们说你定义一个闭包
let closure: Int -> Bool
一旦闭包类型已知(参数类型和返回类型),编写它很容易,您可以命名参数列表,然后是关键字in
,然后是函数体(带有如果函数返回类型不是Void
(又名()
)
// closure that returns if an integer is even
closure = { integer in
return integer %2 == 0
}
在您的情况下,Int -> Int -> Bool -> String
表示
在代码中编写代码的方法:
func prepareForSum(first: Int) -> Int -> Bool -> String {
return { secondInteger in
return { shouldSumIntegers in
var result: Int
// for the sake of example
// if boolean is true, we sum
if shouldSumIntegers {
result = first + secondInteger
} else {
// otherwise we take the max
result = max(first, secondInteger)
}
return String(result)
}
}
现在你可以像那样使用它
let sumSixteen = prepareForSum(16) // type of sumSixteen is Int -> Bool -> String
let result1 = sumSixteen(3)(true) // result1 == "19"
let result2 = sumSixteen(26)(false) // result2 == "26"