函數的參數
// 無參數函數
func sayHelloWorld() -> String {
return "hello, world"
}
// 單參數函數
func sayHello(presonName: String) -> String {
let greeting = "Hello," + presonName + "!"
return greeting
}
private func sayHelloAgain(presonName: String) -> String {
let greeting = "Hello again," + presonName + "!"
return greeting
}
//多參數函數
func sayHello(personName: String, alreadyGreeted: Bool) -> String {
if alreadyGreeted {
return sayHelloAgain(personName)
} else {
return sayHello(personName)
}
}
函數的參數名稱
說明:函數參數都有一個外部參數名和一個局部參數名。外部參數名用于函數調用時標注傳遞給函數的參數,局部參數名在函數的實現內部使用。
一般情況下,第一個參數省略其外部參數名,第二個以及隨后的參數使用其局部參數名稱作為外部參數名。所有參數必須有獨一無二的局部參數名。盡管多個參數可以有相同的外部參數名,但不同的外部參數名能讓你的代碼更有可讀性。
例:
// 函數實現
func someFunction(firstParamName: Int, secondParamName: Int) {
// 這里是函數內部實現,打印傳入的參數
print("\(firstParamName) - \(secondParamName)")
}
// 函數調用
someFunciton(1, secondParamName: 2)
1 指定外部參數名
可以在局部參數名前面指定外部參數名,中間以空格分割:
例:
// 函數實現
func someFunction(externalParamName localParamName: Int) {
// 這里是函數內部實現,打印傳入的參數
print("\(localParamName)")
}
// 函數調用
someFunction(externalParamName: 1)
2 忽略外部參數名
如果不想為第二個及后續的參數設置外部參數名,用一個下劃線(_)代替一個明確的參數名
例:
// 函數實現
func someFunction(firstParamName: Int, _ secondParamName: Int) {
print("\(firstParamName) - \(secondParamName)")
}
// 函數調用
someFunction(1, 2)
3 默認參數值
可以在函數體中為每個參數定義默認值。當默認值被定義后,調用這個函數值時可以忽略這個參數
例:
// 函數實現
func someFunction(paramWithDefault: Int = 12) {
print(paramWithDefault)
}
// 函數調用
someFunction(6) // 傳入參數,打印結果為6
someFunction(12) // 忽略參數,則使用默認參數,打印結果12
注意:
將帶有默認值的參數放在函數參數列表的最好,這樣可以保證在函數調用時,非默認參數的順序是一致的,同時使得相同的函數在不同情況下調用時顯得更為清晰
4 可變參數
可變參數用于接受零個或多個值(個數不確定),通過在變量類型名后面加入(...)的方式定義
例子:
// 函數實現
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)
5 常量參數和變量參數
函數的參數默認是常量,在函數體內是不能修改的,這樣防止用戶意外的修改。
但是,有時候必須需要修改,則可以指定參數為變量類型來進行修改
例:
// 函數實現
func changeParam(var presonName: String) -> String {
presonName = "chenwen"
return presonName
}
// 函數調用
changeParam("wangxg")
注意:
對變量參數所進行的修改在函數調用結束后便會消失,對于函數體外是不可見的,變量參數的聲明周期隨函數調用的結束而結束。
6 輸入輸出參數
用途:
如果想要一個函數可以修改參數的值,并且想要這些修改在函數調用結束后仍然存在,那么久應該把參數定義為輸入輸出參數
例:
// 函數實現
func swapTowInts(inout a: Int, inout _ b: Int) {
let temporaryA = a
a = b
b = temporaryA
}
// 函數調用
var x = 5, y = 10
function1.swapTowInts(&x, &y)
print("x= \(x), y = \(y)")
注意:
1 只能傳遞變量給輸入輸出參數,不能傳遞常量和字面值(因為不能被修改)
2 當傳入的參數作為輸入輸出參數是,需要在參數名前面加&符號
3 輸入輸出參數不能有默認值
4 可變參數不能用inout標記,如果標記,這個參數不能被var或let標記
5 輸入輸出參數和返回值是不一樣的,輸入輸出參數是函數對外參數影響的另一種方式
函數的返回值
最常用的一種對外部參數影響的一種方式
// 無返回值
func sayGoodbye(personName: String) {
print("Goodbye, \(personName)")
}
//多重返回值函數(通過元組返回)
func minMax(array: [Int]) -> (min: Int, max: Int) {
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)
}
// 可選元組的返回類型
func minMax(array: [Int]) -> (min: Int, max: Int)? {
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)
}
函數類型
類似于c或Objective-C中的函數指針變量
1 基本使用
// 函數實現 (Swift實現)
func addTwoInts(a: Int, _ b: Int) -> Int {
return a + b
}
// 定義并調用 (Swift調用)
var mathFunction: (Int, Int) ->Int = addTwoInts
mathFunction(2, 3)
2 函數類型作為參數類型
類似于c或Objective-C中把函數指針作為參數
// 函數實現
func addTowInts (a: Int, _ b: Int) -> Int {
return a + b
}
// 作為參數傳遞
func printMathResult(MathFunction: (Int, Int) -> Int, _ a: Int, _ b: Int) {
print("Result: \(MathFunction(a, b))")
}
// 調用
printMathResult(addTowInts, 3, 7)
3 函數類型作為返回值
// 函數實現
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
}
// 調用
let currentValue = 3
let moveNearerToZero = chooseStepFunction(currentValue > 0)
print(moveNearerToZero(currentValue))