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"