定义和调用函数
每一个函数都有一个函数名,用来 述了函数执行的任务。要使用一个函数时,可使用它的名称进行“调用”,并通过它的输入值(称为实参–argument)来匹配函数的参数类型。一个函数的实参 (arguments)必须始终和函数形参(parameter)顺序一致。
//使用箭头->来指明函数的返回 类型(一个连字符后跟一个向右的箭头),后边跟着返回的类型名称。
func sayHello (personName: String) ->String {
// let greeting = "Hello," + personName + "!"
// return greeting
return "Hello again," + personName + "!"
}
print(sayHello("Anna"))
无形参函数
func sayHelloWorld() -> String {
return "hello,world"
}
print(sayHelloWorld())
函数的形参和返回值
//多输入形参,逗号分隔。
func halfOpenRangeLength (start:Int,end:Int) ->Int {
return end - start
// 设置半开区间的开始和结束索引,用来计算在范围内有多少元素
}
print(halfOpenRangeLength(1, end: 10)) //9
//无返回值的函数
func sayGoodbye(personName:String) {
print("Goodbye,\(personName)!")
}
sayGoodbye("Dave")
//函数形参名
func join(s1:String,s2:String,joiner:String) ->String {
return s1 + joiner + s2
}
join("hello", s2: "world", joiner: ",")
可变参数
函数调用时,如果不确定参数的数量,通过在变量类型后面加(…)定义可变参数,一个函数最多可能有一个可变参数,切必须是函数表中最后的一个。
func arithmeticMean(numbers:Double...) ->Double {
var total:Double = 0
for number in numbers {
total += number
}
return total / Double (numbers.count)
}
arithmeticMean(1,2,3,4,5) //3.0
arithmeticMean(3,8,19) //10.0
输入输出参数
如果想要一个函数可以修改参数的值,并且这些修改在函数结束调用后仍然存在,那就可以定义为输入输出参数,在参数前面添加inout关键字,这个值被函数修改后被传出函数,并替换原来的值,同时,传入的只能是变量而不能是常量,当传入的参数作为作为输入输出参数时,需要在参数面前加 & 符号,表示这个值可以被修改
func swapTwoInts(inout a: Int, inout b: Int) {
let temporaryA = a
a = b
b = temporaryA
}
var someInt = 3
var anotherInt = 107
swapTwoInts(&someInt, b: &anotherInt)
print("someInt is now \(someInt), and anotherInt is now \(anotherInt)")
// prints "someInt is now 107, and anotherInt is now 3"
函数类型
每个函数都有特定的函数类型,由参数类型和返回类型组成
func addTwoInts(a: Int, b: Int) -> Int {
return a + b
}
func multiplyTwoInts(a: Int, b: Int) -> Int {
return a * b
}
// 以上两个的函数类型是 (Int, Int) -> Int
func printHelloWorld() {
print("hello, world")
}
这个函数类型是 () -> ()
在返回箭头 (->) 后写一个完整的函数类型,表示将函数类型作为另一个函数的返回类型
func stepForward(input: Int) -> Int {
return input + 1
}
func stepBackward(input: Int) -> Int {
return input - 1
}
func chooseStepFunction(backwards: Bool) -> (Int) -> Int {
return backwards ? stepBackward : stepForward
}
var currentValue = 3
let moveNearerToZero = chooseStepFunction(currentValue > 0)
// moveNearerToZero now refers to the stepBackward() function
print("Counting to zero:")
// Counting to zero:
while currentValue != 0 {
print("\(currentValue)... ")
currentValue = moveNearerToZero(currentValue)
}
print("zero!")
// 3...
// 2...
// 1...
// zero!