[Swift]函数类型
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(shanqingyongzhi)
➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/ )
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:https://www.cnblogs.com/strengthen/p/9950949.html
➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
函数类型
每个函数都有一个特定的函数类型,由函数的参数类型和返回类型组成。
例如:
1 func addTwoInts(_ a: Int, _ b: Int) -> Int { 2 return a + b 3 } 4 5 func multiplyTwoInts(_ a: Int, _ b: Int) -> Int { 6 return a * b 7 }
这个例子定义了两个简单的数学函数叫做addTwoInts
和multiplyTwoInts
。这些函数每个都取两个Int
值,并返回一个Int
值,这是执行适当的数学运算的结果。
这两种功能的类型是。这可以理解为:(Int, Int) -> Int
“一个函数有两个参数,都是类型Int
,并返回一个类型的值Int
。”
这是另一个例子,对于没有参数或返回值的函数:
1 func printHelloWorld() { 2 print("hello, world") 3 }
此函数的类型是“或没有参数且返回的函数”。() -> Void
Void
使用函数类型
您可以像使用Swift中的任何其他类型一样使用函数类型。例如,您可以将常量或变量定义为函数类型,并为该变量分配适当的函数:
var mathFunction: (Int, Int) -> Int = addTwoInts
这可以理解为:
“定义一个名为的变量mathFunction
,它的类型为'一个带两个Int
值的函数,并返回一个Int
值'。设置这个新变量来引用被调用的函数addTwoInts
。“
该addTwoInts(_:_:)
函数与mathFunction
变量具有相同的类型,因此Swift的类型检查器允许这种赋值。
您现在可以使用以下名称调用已分配的函数mathFunction
:
1 print("Result: \(mathFunction(2, 3))") 2 // Prints "Result: 5"
具有相同匹配类型的不同函数可以以与非函数类型相同的方式分配给同一变量:
1 mathFunction = multiplyTwoInts 2 print("Result: \(mathFunction(2, 3))") 3 // Prints "Result: 6"
与任何其他类型一样,在将函数赋值给常量或变量时,可以将其保留为Swift以推断函数类型:
1 let anotherMathFunction = addTwoInts 2 // anotherMathFunction is inferred to be of type (Int, Int) -> Int
函数类型作为参数类型
您可以使用函数类型,例如作为另一个函数的参数类型。这使您可以为函数调用者保留函数实现的某些方面,以便在调用函数时提供。(Int, Int) -> Int
以下是从上面打印数学函数结果的示例:
1 func printMathResult(_ mathFunction: (Int, Int) -> Int, _ a: Int, _ b: Int) { 2 print("Result: \(mathFunction(a, b))") 3 } 4 printMathResult(addTwoInts, 3, 5) 5 // Prints "Result: 8"
此示例定义了一个名为的函数printMathResult(_:_:_:)
,该函数有三个参数。第一个参数被调用mathFunction
,并且是类型。您可以传递该类型的任何函数作为第一个参数的参数。第二和第三参数被称为和,且都是类型的。这些用作提供的数学函数的两个输入值。(Int, Int) -> Int
a
b
Int
当printMathResult(_:_:_:)
被调用时,它传递的addTwoInts(_:_:)
功能,而整数值3
和5
。它与值调用提供的函数3
和5
,并打印结果8
。
其作用printMathResult(_:_:_:)
是将调用结果打印到适当类型的数学函数。这个函数的实现实际上做了什么并不重要 - 只关注函数的类型是正确的。这使得能够printMathResult(_:_:_:)
以类型安全的方式将其一些功能传递给函数的调用者。
函数类型作为返回类型
您可以使用函数类型作为另一个函数的返回类型。您可以通过->
在返回函数的返回箭头()之后立即编写完整的函数类型来完成此操作。
下一个示例定义了两个名为stepForward(_:)
和的简单函数stepBackward(_:)
。该stepForward(_:)
函数返回的值比其输入值多一个,并且该stepBackward(_:)
函数返回的值比其输入值小1。这两个函数都有以下类型:(Int) -> Int
1 func stepForward(_ input: Int) -> Int { 2 return input + 1 3 } 4 5 func stepBackward(_ input: Int) -> Int { 6 return input - 1 7 }
这是一个名为的函数chooseStepFunction(backward:)
,其返回类型为。该函数根据名为的布尔参数返回函数或函数:(Int) -> Int
chooseStepFunction(backward:)
stepForward(_:)
stepBackward(_:)
backward
1 func chooseStepFunction(backward: Bool) -> (Int) -> Int { 2 return backward ? stepBackward : stepForward 3 }
您现在可以使用chooseStepFunction(backward:)
获取一个方向或另一个方向的功能:
1 var currentValue = 3 2 let moveNearerToZero = chooseStepFunction(backward: currentValue > 0) 3 // moveNearerToZero now refers to the stepBackward() function
上面的示例确定是否需要正或负步骤来移动currentValue
逐渐接近零的变量。currentValue
具有初始值3
,表示返回,导致返回该函数。对返回函数的引用存储在一个被调用的常量中。currentValue > 0
true
chooseStepFunction(backward:)
stepBackward(_:)
moveNearerToZero
现在moveNearerToZero
指的是正确的函数,它可以用来计数到零:
1 print("Counting to zero:") 2 // Counting to zero: 3 while currentValue != 0 { 4 print("\(currentValue)... ") 5 currentValue = moveNearerToZero(currentValue) 6 } 7 print("zero!") 8 // 3... 9 // 2... 10 // 1... 11 // zero!