Swift 笔记:函数


Apple-Swift-logo

函数是一段完成特定任务的独立代码片段。在 Swift 中,每个函数都有一个由函数的参数值类型和返回值类型组成的类型。函数的定义可以写在其他函数定义中,这样可以在嵌套函数范围内实现功能封装。

函数的定义与调用

定义一个函数时,可以定义一个或多个有名字和类型的值,作为函数的输入,称为参数,也可以定义某种类型的值作为函数执行结束时的输出,称为返回类型。要使用一个函数时,用函数名来“调用”这个函数,并传给它匹配的输入值(称作实参),函数的实参必须与函数参数表里参数的顺序一致。

func sayHello(name: String) -> String {
    return "Hello, " + name + "!"
}
print(sayHello(name: "Ryan"))

函数参数与返回值

函数可以没有参数:函数名后添加一对圆括号即可,调用时也需要在在函数名后写一对圆括号:

func sayHelloWorld() -> String {
    return "hello, world"
}
print(sayHelloWorld())

函数可以有多种输入参数,这些参数被包含在函数的括号之中,以逗号分隔:

func greet(person: String, alreadyGreeted: Bool) -> String {
    ……
}

函数可以没有返回值:

func greet(person: String) {
    print("Hello, \(person)!")
}

被调用时,一个函数的返回值可以被忽略,但定义了有返回值的函数必须返回一个值,如果在函数定义底部没有返回任何值,将导致编译时错误(compile-time error)。

可以用元组(tuple)类型让多个值作为一个复合值从函数中返回:

func minMax(array: [Int]) -> (min: Int, max: Int) {
    ……
}

如果函数返回的元组类型有可能整个元组都“没有值”,可以使用可选的( optional )元组返回类型反映整个元组可以是nil的事实。可以通过在元组类型的右括号后放置一个问号来定义一个可选元组,例如 (Int, Int)?(String, Int, Bool)?

注意:
可选元组类型如 (Int, Int)? 与元组包含可选类型如 (Int?, Int?) 是不同的.可选的元组类型,整个元组是可选的,而不只是元组中的每个元素值。

函数参数标签和参数名称

每个函数参数都有一个参数标签(argument label)以及一个参数名称(parameter name)。参数标签在调用函数的时候使用;调用的时候需要将函数的参数标签写在对应的参数前面。参数名称在函数的实现中使用。默认情况下,函数参数使用参数名称来作为它们的参数标签。

参数名称必须是唯一的,虽然多个参数拥有同样的参数标签是可能的,但是一个唯一的函数标签能够使代码更具可读性。

指定参数标签

在参数名称前指定它的参数标签,中间以空格分隔:

func someFunction(argumentLabel parameterName: Int) {
    // 在函数体内,parameterName 代表参数值
}

忽略参数标签

如果不希望为某个参数添加一个标签,可以使用一个下划线(_)来代替一个明确的参数标签:

func someFunction(_ firstParameterName: Int, secondParameterName: Int) {
    ……
}

默认参数值

可以在函数体中通过给参数赋值来为任意一个参数定义默认值(Deafult Value)。当默认值被定义后,调用这个函数时可以忽略这个参数。

一般来说,没有默认值的参数更加的重要,将不带默认值的参数