" Int - >的类型布尔" "内部 - >布尔 - > INT""内部 - >字符串 - >内部 - >布尔"

时间:2015-12-29 05:39:50

标签: ios swift

有一个功能:

 func (first: Int) -> Int -> Bool -> String {

    return  ?
 }

如何写回程值? 我对上面的func的返回类型非常困惑。

2 个答案:

答案 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表示

  • 一个以Int作为参数并返回的函数
    • 一个以Int作为参数并返回的函数
      • 一个需要的功能 Bool作为参数并返回
        • 一个字符串

在代码中编写代码的方法:

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"