Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios “的类型”;Int->;“Bool”&引用;Int->;Bool->;Int"&引用;Int->;字符串->;Int-&燃气轮机;“Bool”;_Ios_Swift - Fatal编程技术网

Ios “的类型”;Int->;“Bool”&引用;Int->;Bool->;Int"&引用;Int->;字符串->;Int-&燃气轮机;“Bool”;

Ios “的类型”;Int->;“Bool”&引用;Int->;Bool->;Int"&引用;Int->;字符串->;Int-&燃气轮机;“Bool”;,ios,swift,Ios,Swift,有一个函数: func (first: Int) -> Int -> Bool -> String { return ? } 如何写入返回值? 我对上面func的返回类型非常困惑。在解析函数/闭包返回时,从右向左读取。最右边的一个是返回类型,其余的可以放在括号中 因此,您的函数声明相当于 func (first: Int) -> ((Int) -> ((Bool) -> String)) 以及 func (first: Int)(_ sec

有一个函数:

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

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

在解析函数/闭包返回时,从右向左读取。最右边的一个是返回类型,其余的可以放在括号中

因此,您的函数声明相当于

func (first: Int) -> ((Int) -> ((Bool) -> String))
以及

func (first: Int)(_ second: Int)(_ third: Bool) -> String
尽管Swift 3.0不再支持此表单(感谢@Andrea的提醒)

这被称为。函数返回一个以
Int
为参数的函数,并返回另一个以
Bool
为参数并返回
字符串的函数。这样你就可以很容易地链
函数调用

因此,方法体必须返回列表中的第一个函数,该函数具有以下签名:

func ((Int) -> ((Bool) -> String))
你可以这样称呼它:

f(1)(2)(true)

假设您定义了一个闭包

let closure: Int -> Bool
一旦知道了闭包类型(参数类型和返回类型),编写它就相当容易了,您可以命名参数列表,然后在
中命名关键字
,然后命名函数体(如果函数返回类型不是
Void
(又称
()
),则在末尾有一个返回)

在您的例子中,
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"

它所做的事情过于复杂,应该重新编写probably@Fonix-这是Swift建立的功能编程支持的一部分-in@Cristik不要让阅读/使用变得不那么难看。
f(1)(2)(正确)
obj-c和swift试图让开发人员使用的“函数应该读起来像句子一样”(有充分的理由)这可能是一个很好的理由,但我相信它是可以的avoidable@Fonix有些情况下,函数式编程概念会生成更小、更可读、更可测试的代码。本问题中的示例可能并非如此(无论如何,并非没有上下文)但是,我认为curry是指当一个函数包含多个参数时,将其转换为一个函数,该函数返回一个函数,该函数返回一个函数(…等等,每个参数)。问题中没有提到具有多个参数的函数。在讨论中,currying变换可能最终生成函数签名。currying信息用于解释如何最终生成返回函数的函数,返回函数等。不幸的是,currying很酷,将在Swift 3.0 a中删除根据github上的swift进化列表,感谢@Andrea的提醒,我已经用这些信息更新了答案。
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"