From 5b716e96f20709e2703542ae6c00f075a9363f70 Mon Sep 17 00:00:00 2001 From: "oldcoderteam@163.com" Date: Sat, 24 Jan 2015 18:35:45 +0800 Subject: [PATCH] =?UTF-8?q?[OldCoderTeam]=E4=BF=AE=E6=AD=A3=E4=BA=86?= =?UTF-8?q?=E6=9F=AF=E9=87=8C=E5=8C=96=E5=87=BD=E6=95=B0=E9=83=A8=E5=88=86?= =?UTF-8?q?=E7=9A=84=E7=BF=BB=E8=AF=91=EF=BC=8C=E4=BD=BF=E5=85=B6=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E8=87=B3XCode6.1.1=E6=9C=80=E6=96=B0=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/chapter3/05_Declarations.md | 52 +++++++++++++++++++++++++----- 1 file changed, 44 insertions(+), 8 deletions(-) diff --git a/source/chapter3/05_Declarations.md b/source/chapter3/05_Declarations.md index 1ebeedf9..609a72d8 100755 --- a/source/chapter3/05_Declarations.md +++ b/source/chapter3/05_Declarations.md @@ -365,31 +365,67 @@ f()和f(x:7)都是只有一个变量x的函数的有效调用,但是f(7)是非 ###柯里化函数和方法(Curried Functions and Methods) -柯里化函数或方法有着如下的形式: +你可以重写一个带有多个参数的函数使它等同于一个只有一个参数并且返回一个函数的函数,这个返回函数携带下一个参数并且返回另外一个函数,一直持续到再没有剩余的参数,此时要返回的函数返回原来的多参函数要返回的原始值。这个重写的函数被称为“柯里化函数”。例如,你可以为```addTwoInts```重写一个等价的```addTwoIntsCurried```的函数。 + +```swift +func addTwoInts(a: Int, b: Int) -> Int { + return a + b +} + +func addTwoIntsCurried(a: Int) -> (Int -> Int) { + func addTheOtherInt(b: Int) -> Int { + return a + b + } + return addTheOtherInt +} +``` + +这个```addTwoInts```函数带有两个整型值并且返回他们的和。```addTwoIntsCurried```函数带有一个整型值,并且返回另外一个带有第二个整型值的函数并使其和第一个整型值相加(这个内嵌的函数从包含它的函数中捕获第一个整型参数的值)。 + +在Swift中,你可以通过以下语法非常简明的写一个柯里化函数: > func `function name`(`parameters`)(`parameters`) -> `return type` { > `statements` > } +> -以这种形式定义的函数的返回值是另一个函数。举例来说,下面的两个声明是等价的: +举例来说,下面的两个声明是等价的: ```swift -func addTwoNumbers(a: Int)(b: Int) -> Int { +func addTwoIntsCurried(a: Int)(b: Int) -> Int { return a + b } -func addTwoNumbers(a: Int) -> (Int -> Int) { - func addTheSecondNumber(b: Int) -> Int { + +func addTwoIntsCurried(a: Int) -> (Int -> Int) { + func addTheOtherInt(b: Int) -> Int { return a + b } - return addTheSecondNumber + return addTheOtherInt } ``` +为了像使用非柯里化函数一样的方式使用```addTwoIntsCurried```函数,你必须用第一个整型参数调用```addTwoIntsCurried```,紧接着用第二个整型参数调用其返回的函数: + ```swift -addTwoNumbers(4)(5) // Returns 9 +addTwoInts(4, 5) +//返回值为9 +addTwoIntsCurried(4)(5) +//返回值为9 ``` -多级柯里化应用如下 +虽然你在每次调用一个非柯里化函数时必须提供所有的参数,你可以使用函数的柯里化形式把参数分配在多次函数调用中,称之为“偏函数应用”,例如你可以为```addTwoIntsCurried```函数使用参数```1```然后把返回的结果赋值给常量```plusOne```: + +```swift +let plusOne = addTwoIntsCurried(1) +// plusOne 是类型为 Int -> Int的函数 +``` + +因为```plusOne```是函数```addTwoIntsCurried```绑定参数为```1```时结果,所以可以调用```plusOne```并且传入一个整型使其和```1```相加。 + +```swift +plusOne(10) +// 返回值为11 +``` > 函数声明语法 > *函数声明* → [*函数头*](..\chapter3\05_Declarations.html#function_head) [*函数名*](..\chapter3\05_Declarations.html#function_name) [*泛型参数子句*](GenericParametersAndArguments.html#generic_parameter_clause) _可选_ [*函数签名(Signature)*](..\chapter3\05_Declarations.html#function_signature) [*函数体*](..\chapter3\05_Declarations.html#function_body)