Swift 函数
在本swift函数教程中,我们将研究如何在Swift中定义和使用函数。
我们将介绍所有可以使您加深理解的概念,并希望在本教程结束时您已掌握快速编程中的函数概念。
Swift函数
根据Apple文档," Swift函数是执行特定任务的自包含代码块。
您为函数指定一个名称,该名称可以标识其功能,该名称用于"调用"该函数以在需要时执行其任务"。
在本教程中,我们将介绍以下概念。
- 命名和未命名参数
- 默认参数值
- 多种返回类型
- 输入参数
- 可变参数
- 嵌套函数
- 作为类型,参数和返回类型的函数
让我们在XCode中打开Playground并直接进入!
定义和调用Swift函数
要定义一个快速函数,我们需要以关键字" func"开头,后跟函数名称,如下所示。
func helloFunction()
{
print("Hello Swift Functions)
}
带参数和返回类型的Swift函数
让我们用参数定义一个swift函数,然后看看它的外观。
func display(websiteName w: String, withTutorial t: String)
{
print(w + " " + t)
}
括号内的代码片段乍一看可能令人生畏。
让我们仔细观察一下。
上述函数内部的参数由两部分组成。
外部参数后跟内部参数。
这种由两个标签组成的参数类型称为命名参数。
参数的类型在冒号":"之后。
websiteName和withTutorial是外部参数,仅在调用函数时使用。
外部参数也称为参数标签。w和t是内部参数,将在函数体内使用。
内部参数也称为局部参数。
以上功能按以下方式调用。
display(websiteName: "theitroad", withTutorial: "Functions In Swift")
Swift函数命名参数在本质上很有用,因为它们通过参数标签指示函数中参数的用途,从而以清晰的方式反映函数的功能。
下面给出了定义函数的另一种方法。
func appendStrings(a : String, b: String)
{
print(a + " " + b)
}
appendStrings(a: "Hello", b:"Swift")
在上面的代码中,我们没有明确设置外部和内部参数。
Swift在上述情况下都将它们视为两者。
要显式地省略外部参数(参数标签),我们需要添加下划线" _"。
以下代码段演示了第一个参数未命名的示例。
func appendString(_ a: String, with b: String)
{
print(a + " " + b)
}
appendString("Hello", with: "Swift")
注意:我们无法在函数内部更改参数值(至少不能通过上述方法更改)。
接下来,让我们创建一个带有返回类型的函数。
func sumOfTwo(_ a: Int, _ b:Int) -> Int
{
return a + b
}
print(sumOfTwo(2,3))
要设置返回类型,我们添加了运算符->,然后添加了要返回的数据类型。
可以在参数类型之后分配函数中任何参数的默认值。
如果定义了默认值,则可以在调用函数时忽略该参数。
让我们创建一个为参数设置默认值的函数,如下所示
func sum(_ a:Int, _ b:Int = 2) -> Int
{
return a + b
}
print(sum(5)) //Prints 7
print(sum(5, 3)) //Prints 8
Swift Function输入参数
inout参数:要更改参数的值,以使新值在函数调用结束后仍保持不变,我们将参数定义为inout。
下面的代码段演示了具有此类参数的功能。
var i = 3
print(i) //prints 3
func increment(_ i: inout Int, by x: Int) -> Int
{
i = i + x
return i
}
increment(&i, by: 3)
print(i) //prints 6
常量不能作为swift函数的inout参数传递。
注意:inout参数类似于在C中通过引用传递。
Swift函数可变参数
Swift函数可变参数接受零个或者多个指定类型的值。
每个函数只允许使用一个可变参数。
可变参数在参数类型之后用" ..."表示,如下所示。
func makeSentence( words: String...) -> String
{
var sentence = ""
for word in words
{
sentence = sentence + " " + word
}
return sentence
}
makeSentence(words: "Function","having", "Variadic parameters","Add as many strings here you want", "Can use one variadic parameter per func","Make full use")
Swift函数返回多个值
我们可以使用元组类型作为函数的返回类型,以将多个值作为一个复合值返回,如下所示。
func returnSentenceAndWordCount(_ strings: String...) -> (sentence: String, wordCount: Int)
{
var sentence = ""
for s in strings
{
sentence = sentence + " " + s
}
return (sentence, strings.count)
}
let data = returnSentenceAndWordCount("Function","returns a tuple", "containing", "sentence and number of strings and word count")
print(data.sentence + "\n\(data.wordCount)")
使用返回类型上的点运算符访问元组成员。
Swift中的嵌套函数
Swift允许我们在一个函数内定义一个函数,如下所示。
func sayHello(to name: String) {
let s = "Hello " + name
func printString() {
print(s)
}
}
sayHello(to: "Anupam") //prints Hello Anupam
在上面的代码中,常量s可用于嵌套函数。
Swift函数作为类型,参数和返回类型
函数的参数类型和返回类型可以组成可在Swift中巧妙使用的自定义独立数据类型。
此外,Swift中的函数还允许将另一个函数作为参数或者返回类型传递。
我们将在下面实现所有这些功能。
首先,创建两个基本功能,如下所示。
//Function to calculate square of an integer.
func square(_ num :Int)->Int
{
return num*num
}
square(4) //returns 16
//Function to calculate cube of an integer.
func cube(_ num :Int)->Int
{
return num*num*num
}
cube(4) //returns 64
我们可以将函数分配给变量/常量,如下所示。
var exponentialFunction = square
exponentialFunction被定义为具有Int参数并返回Int参数的函数类型的变量。
现在,我们可以调用变量exponentialFunction,如下面的代码片段所示。
exponentialFunction(4) //This would work the same way as square(4) square(exponentialFunction(5)) //This would return 625 exponentialFunction(exponentialFunction(5)) //Same as above
我们可以将" exponentialFunction"的类型更改为函数" cube",如下所示。
exponentialFunction = cube(_:) square(exponentialFunction(5)) //square of cube of 5. returns 15625
让我们创建一个接受上述函数square和cube作为参数的函数。
var integers = [1,2,3,4,5]
func sumOfExponentialsOf(array a: [Int], with function: (Int)->Int)->Int
{
var result = 0
for x in a
{
result = result + function(x)
}
return result
}
上面的函数计算所有数组元素的函数返回值的总和。
提示:Swift足够聪明,可以根据值推断变量/常量的类型。
注意:第二个参数接受类型为(Int)-> Int的类型,该类型与exponentialFunction的类型相同。
我们将使用上述函数来计算所有数组元素的平方和和立方和,如下所示。
exponentialFunction = square(_:) //sum of squares of all array elements sumOfExponentialsOf(array: integers, with: exponentialFunction) //returns 55 exponentialFunction = cube(_:) //sum of cubes of all array elements sumOfExponentialsOf(array: integers, with: exponentialFunction) //returns 225
最后,一个函数有可能返回另一个函数。
让我们创建一个根据条件返回" square"或者" cube"函数的函数。
func chooseComputation(isSquared b : Bool) -> (Int)->Int{
func square(_ num :Int)->Int
{
return num*num
}
func cube(_ num :Int)->Int
{
return num*num*num
}
if b {
return square
}
else{
return cube
}
}
var result = chooseComputation(isSquared: true)
result(2) //returns 4
result = chooseComputation(isSquared: false)
result(2) //returns 8
" chooseComputation"函数由两个与return类型相同的函数组成。
基于布尔值," chooseComputation"函数返回对两个嵌套函数的引用,然后从结果变量中对其进行引用。

