定义和调用方法
- 可以定义一个或多个名字
- 参数和返回值
无参
func sayHelloWorld() -> String {
return "hello, world"
}
多个参数
func greet(person: String, alreadyGreeted: Bool) -> String {
if alreadyGreeted {
return "already greeted"
}else{
return "greet"
}
}
无返回值
func greet(person: String) { // 省略 -> Void
print("Hello, \(person)")
// return () // 严格来讲,返回值是一个空的元祖
}
func greetTest() -> Void {
// return ()
}
返回多个值
func minMax(array: [Int]) -> (min: Int, max: Int) {
return (2, 4)
}
let bounds = minMax(array: [2, 4])
bounds.min // 访问元组中的值
bounds.max
参数标签和参数名
- 多个参数可以有相同的参数标签
- 默认参数名作为参数标签
- 参数标签写在参数名前面,允许忽略 "_"
func someFunction(_ firstParameterName: Int, secondParamterName: Int) {
}
func otherFunction(firstArgumentLabel firstParamterName: Int, secondArgumentLabel secondParamterName: Int) {
}
otherFunction(firstArgumentLabel: 1, secondArgumentLabel: 2)
someFunction(1, secondParamterName: 2)
参数默认值
设置默认值时,调用时可以忽略该参数
func someFunctionDefault(parameterWithoutDefault: Int, parameterWithDefault: Int = 12) {
}
someFunctionDefault(parameterWithoutDefault: 3, parameterWithDefault: 4)
someFunctionDefault(parameterWithoutDefault: 3)
多变参数 - 可以传 0 或者多个指定类型的值
一个函数最多可以有一个多变参数
func arithmeticMean(_ numbers: Double...) -> Double {
var total: Double = 0
for number in numbers {
total += number
}
return total / Double(numbers.count)
}
arithmeticMean()
输入输出参数
- 不能有默认值,多变参数不能标记 inout 关键字
- 参数传进去方法默认是常量,使用inout 关键字(加在参数类型前面),必须传进去一个变量,不能是变量或字面量
- 调用时会在变量前面加 &
func swapTwoInts(_ a: inout Int, _ b: inout Int) {
let temporaryA = a
a = b
b = temporaryA
}
var someInt = 3
var anotherInt = 107
swap(&someInt, &anotherInt)
使用方法类型
func addTwoInts(_ a: Int, _ b: Int) -> Int {
return a + b
}
var mathFunction: (Int, Int) -> Int = addTwoInts
print("Result: \(mathFunction(2, 3))")
方法类型作为参数类型
func printMatchResult(_ matchFunction: (Int, Int) -> Int, _ a : Int, _ b: Int) {
print("Result: \(matchFunction(a, b))")
}
printMatchResult(mathFunction, 2, 3)
方法类型作为返回值
func stepForward(_ input: Int) -> Int {
return input + 1
}
func stepBackward(_ input: Int) -> Int {
return input - 1
}
func chooseStepFunction(backward: Bool) -> (Int) -> Int {
return backward ? stepBackward : stepForward;
}
var currentValue = 3
let moveNearerToZero = chooseStepFunction(backward: currentValue > 0)
嵌套方法
func nestedChooseStepFunction(backward: Bool) -> (Int) -> Int {
func stepForward(input: Int) -> Int { return input + 1 }
func stepBackward(input: Int) -> Int { return input - 1 }
return backward ? stepBackward : stepForward
}