Swift语法_函数参数与返回值

时间:2022-02-02 00:27:27

函数是用来完成特定任务的独立的代码块。你给一个函数起一个合适的名字,用来标识函数做什么,并且当函数
需要执行的时候,这个名字会被用于“调用”函数。

Swift 统一的函数语法足够灵活,可以用来表示任何函数,包括从最简单的没有参数名字的 C 风格函数,到复杂 的带局部和外部参数名的
Objective-C 风格函数。参数可以提供默认值,以简化函数调用。参数也可以既当做传
入参数,也当做传出参数,也就是说,一旦函数执行结束,传入的参数值可以被修改。

在 Swift 中,每个函数都有一种类型,包括函数的参数值类型和返回值类型。你可以把函数类型当做任何其他普
通变量类型一样处理,这样就可以更简单地把函数当做别的函数的参数,也可以从其他函数中返回函数。函数的
定义可以写在在其他函数定义中,这样可以在嵌套函数范围内实现功能封装。

举个栗子:

//函数定义规范:以func作为前缀。指定函数返回类型时,用返回箭头 -> (一 个连字符后跟一个右尖括号)后跟返回类型的名称的方式来表示

func sayHello(personName: String) -> String {
let greeting = "Hello, " + personName + "!"
return greeting
}

函数参数与返回值:

//无参函数
func sayHelloWorld()->String{
return "hello,world"
}
print(sayHelloWorld())
//一个参数的函数
func sayHello(personName:String)->String{
return "hello , " + personName + "!"
}
print(sayHello("niki"))


func sayHelloAgain(personName:String)->String{
return "hello agin, " + personName + "!"
}
print(sayHelloAgain("Frank"))
//多参函数
func sayHello(personName:String,alreadyGreeted:Bool)->String{
if alreadyGreeted {
return sayHelloAgain(personName)
}else{
return sayHello(personName)
}
}
print(sayHello("niki", alreadyGreeted: true))
//无返回值函数
func sayGoodbye(personName:String){
print("Goodbye, \(personName)!")
}
sayGoodbye("Paul")
/*注意
严格上来说,虽然没有返回值被定义,sayGoodbye(_:) 函数依然返回了值。没有定义返回类型的函数会返回特 殊的值,叫 Void 。它其实是一个空的元组(tuple),没有任何元素,可以写成 () 。
*/
//一个返回值函数
func printAndCount(stringToPrint:String)->Int{
print(stringToPrint)
return stringToPrint.characters.count

}
printAndCount("hello world")

//被调用时,一个函数的返回值可以被忽略(但定义了有返回值的函数必须返回一个值)
//忽略样式
func printWithCount(stringToPrint:String){
printAndCount(stringToPrint)
}
printWithCount("hello world")
//多个返回值函数(元组样式)
func minMax(myArray:[Int])->(min:Int,max:Int){
var currentMin = myArray[0]
var currentMax = myArray[0]

for value in myArray[1..<myArray.count]
{
if value < currentMin
{
currentMin = value
}else if value > currentMax
{
currentMax = value
}
}
return(currentMin,currentMax)
}
////元组的成员不需要在元组从函数中返回时命名,因为它们的名字已经在函数返回类型中指定了
let bounds = minMax([2,3,4,5,8,89])
print("min is \(bounds.min) and max is \(bounds.max)")

***************优化空数组解决如下***************

/**
* 可选元组返回类型
如果函数返回的元组类型有可能整个元组都“没有值”,你可以使用可选的(Optional) 元组返回类型反映整个元组可以是 nil 的事实。
定义一个可选元组,例如 (Int, In t)? 或 (String, Int, Bool)?

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


func minMax(array: [Int]) -> (min: Int, max: Int)? {
if array.isEmpty { return nil }
var currentMin = array[0]
var currentMax = array[0]
for value in array[1..<array.count] {
if value < currentMin {
currentMin = value
} else if value > currentMax {
currentMax = value
}
}
return (currentMin, currentMax)
}

//使用可选绑定来检查 minMax(_:) 函数返回的是一个实际的元组值还是 nil :
if let bounds = minMax([8, -6, 2, 109, 3, 71]) {
print("min is \(bounds.min) and max is \(bounds.max)")
}