Swift 函数

从这篇文章,你将学习到如何定义和使用 Swift 函数,让我们开始吧。
定义和使用函数
下面定义名称 greeting 的函数,只有一个 String 类型的 name 参数,函数返回值为 String 类型。
func greeting(name: String) -> String {
let welcome = "Hello, " + name
return welcome
}
print(greeting(name: "Jack"))
print(greeting(name: "Lucy"))
函数参数和返回值
没有参数的函数
func greeting() -> String {
return "Hello World"
}
有多个参数的函数
参数之间用逗号分割。
func greeting(firstName: String, lastName: String) -> String {
return "Hello, " + firstName + " " + lastName
}
没有返回值的函数
func greeting(firstName: String, lastName: String) {
print("Hello, " + firstName + " " + lastName)
}
有多个返回值的函数
函数通过返回一个元组来返回多个值。
func greeting(name: String) -> (hello: String, goodbye: String) {
let hi = "Hello, " + name
let bye = "Goodbye, " + name
return (hi, bye)
}
函数参数名称
函数的每一个参数都有外部名称和内部名称,外部名称在调用函数时使用,内部名称在函数内部实现中使用。
默认情况
函数参数的外部名称和内部名称一致,如下面的示例。
func greeting(firstName: String, lastName: String) {
print("Hello, " + firstName + " " + lastName)
}
greeting(firstName: "Lincoln", lastName: "Park")
指定外部名称
下面示例中 firstName 和 lastName 是外部名称,first 和 last 是内部名称,调用函数时也要写明外部名称。
func greeting(firstName first: String, lastName last: String) {
print("Hello, " + first + " " + last)
}
greeting(firstName: "Lincoln", lastName: "Park")
忽略外部名称
用下划线来忽略外部名称。
func greeting(_ firstName: String, _ lastName: String) {
print("Hello, " + firstName + " " + lastName)
}
greeting("Lincoln", "Park")
默认参数值
函数参数可以指定默认值,在没有传入参数值时,此参数就使用默认值。
func greeting(name: String = "Unkown") {
print("Hello, " + name)
}
greeting(name: "James")
greeting()
可变参数
函数接受零到多个参数值。
func sum(numbers: Int...) -> Int {
var total = 0
for number in numbers {
total += number
}
return total
}
sum(numbers: 2, 3)
sum(numbers: 5, 6, 7)
传入传出参数
func swap(_ a: inout Int, _ b: inout Int) {
let temporaryA = a
a = b
b = temporaryA
}
var someInt = 3
var anotherInt = 10
swap(&someInt, &anotherInt)
print("someInt is now \(someInt), and anotherInt is now \(anotherInt)")
函数类型
基本含义
函数类型由参数类型和返回值类型构成,如下示例的函数类型就是 (String, String) -> String
func greeting(firstName: String, lastName: String) -> String {
return "Hello, " + firstName + " " + lastName
}
使用函数类型
既然是类型,因此也可以像其它类型一样,定义变量和常量,还有赋值。
func hello(name: String) {
print("Hello, " + name)
}
func goodbye(name: String) {
print("Goodbye, " + name)
}
var greeting: (String) -> Void = hello
greeting("Jack")
greeting = goodbye
greeting("Jack")
函数类型做为参数
func hello(name: String) -> String {
return "Hello, " + name
}
func goodbye(name: String) -> String {
return "Goodbye, " + name
}
func printGreeting(_ greeting: (String) -> String, name: String) {
print(greeting(name))
}
printGreeting(hello, name: "Jack")
printGreeting(goodbye, name: "Jack")
函数类型做为返回值
func hello(name: String) -> String {
return "Hello, " + name
}
func goodbye(name: String) -> String {
return "Goodbye, " + name
}
func greeting(leave: Bool) -> (String) -> String {
if leave {
return goodbye
} else {
return hello
}
}
var welcome = greeting(leave: true)
print(welcome("Jack"))
welcome = greeting(leave: false)
print(welcome("Jack"))
嵌套函数
上面的示例中定义的函数都是全局函数,也就是任何地方都可以调用,如果想隐藏一些实现的细节,可以使用嵌套函数,当然还可以通过函数返回值将内部函数返回来给外部使用。
func greeting(leave: Bool) -> (String) -> String {
func hello(name: String) -> String {
return "Hello, " + name
}
func goodbye(name: String) -> String {
return "Goodbye, " + name
}
if leave {
return goodbye
} else {
return hello
}
}
var welcome = greeting(leave: true)
print(welcome("Jack"))
welcome = greeting(leave: false)
print(welcome("Jack"))