開發者也能夠對外部參數設置默認值。這時,調用的時候,也能夠省略參數傳遞本文選自Swift1.2語言快速入門v2.0。swift
【示例7-11】如下的代碼就爲外部參數toString、withJoiner設置了默認的參數"Swift"和"---"。代碼以下:性能優化
import Foundation函數
func join(string s1: String, toString s2: String="Swift", withJoiner joiner:String="---"){性能
println("\(s1)\(joiner)\(s2)")優化
}ui
join(string:"Hello")spa
因爲toString和withJoiner已經設置了默認值,因此調用的時候就省略對兩個參數的傳值。運行結果以下所示:.net
Hello---Swiftorm
使用可變參數,可使一個參數接受零個或多個指定類型的值。設定一個可變參數須要在參數類型名後添加「...」本文選自Swift1.2語言快速入門v2.0。生命週期
【示例7-12】下面代碼使用可變參數計算任意數字的算術平均值。代碼以下:
import Foundation
func average(numbers: Double...){
var total: Double = 0
for number in numbers {
total += number
}
println(total/Double(numbers.count))
}
average(1, 2, 3, 4, 5)
average(3, 8, 19)
運行結果以下所示:
3.0
10.0
在使用可變參數時,須要注意如下幾點:
1.只有一個可變參數
在一個函數中,可變參數只能夠有一個。不然,就會出現錯誤。以下代碼:
func average(numbers: Double...,aa:Int...){
…
}
在一個函數中出現了兩個可變參數number和aa,致使程序出現了以下的錯誤提示信息:
'...' must be on the last parameter
2.可變參數必須放在最後
可變參數無論在何時都必須放在全部參數以後,即做爲最後一個參數。不然,就會出現錯誤,以下代碼:
func average(numbers: Double...,aa:Int){
…
}
在此代碼中可變參數numbers放在了aa參數以前,致使程序出現了以下的錯誤信息:
'...' must be on the last parameter
在函數中,參數默認都是常量。若是想要改變一個函數參數的值,會引發程序錯誤。如如下代碼:
func fun(num:Int){
num=num+1
println(num)
}
在此代碼中,函數參數num默認是一個常量,而常量的值是不能改變的,因此致使程序出現以下的錯誤信息
Cannot assign to 'let' value 'num'
若是想要對參數進行修改,必需要使用一個相似於變量的參數,Swift稱之爲變量參數。變量參數的定義就是在參數名前使用一個var關鍵字。如下的代碼就是使用了變量參數實現了字符串右對齊的功能。代碼以下:
import Foundation
func alignRight(var string: String, cou: Int, pad: String) {
var sc=count(string)
let amountToPad = cou - sc //獲取輸入"*"的個數
//遍歷
for _ in 1...amountToPad {
string = pad + string
}
println(string)
}
let originalString1 = "swift"
alignRight(originalString1, 10, "*")
let originalString2 = "Hi"
alignRight(originalString2, 10, "*")
let originalString3 = ""
alignRight(originalString3, 10, "*")
運行結果以下所示:
*****swift
********Hi
**********
注意:變量參數只能存在於函數調用的生命週期中。
以上所講的參數只能夠在函數自己內改變。例如如下的代碼,想要實現對a和b數值的交換。代碼以下本文選自Swift1.2語言快速入門v2.0:
import Foundation
func swapTwoInt(var number1: Int, var number2: Int) {
//實現兩個整數的交換
let temp = number1
number1 = number2
number2 = temp
println("函數體內:a=\(number1)")
println("函數體內:b=\(number2)")
}
var a=2
var b=3
println("交換前")
println("a=\(a)")
println("b=\(b)")
println("交換後")
swapTwoInt(a, b)
println("a=\(a)")
println("b=\(b)")
運行結果以下所示:
交換前
a=2
b=3
交換後
函數體內:a=3
函數體內:b=2
a=2
b=3
在運行結果中能夠看到,a和b的值可在函數自己內實現了交換。若是開發者想用一個函數來修改參數的值,而且想讓這些變化在函數調用後仍然有效。這時,須要定義輸入-輸出參數。它的定義是經過在參數名前加入inout關鍵字。其語法形式以下:
func 函數名(inout 參數名: 數據類型, ……) {
…
}
輸入-輸出參數都有一個傳遞給函數的值,將函數修改後,再從函數返回來替換原來的值。其調用形式以下:
函數名(&參數, ……)
其中,參數前面加上&操做符。
【示例7-13】如下的代碼使用輸入輸出參數實現a和b數值的交換功能。代碼以下:
import Foundation
func swapTwoInt(inout number1: Int, inout number2: Int) {
//實現兩個整數的交換
let temp = number1
number1 = number2
number2 = temp
}
var a=2
var b=3
println("交換前")
println("a=\(a)")
println("b=\(b)")
println("交換後")
swapTwoInt(&a, &b)
println("a=\(a)")
println("b=\(b)")
運行結果以下:
交換前
a=2
b=3
交換後
a=3
b=2
注意:若是一個函數的參數是輸入-輸出參數,在調用時,必須在參數前加一個「&」符號,不然程序就會出現錯誤。如如下代碼,在調用具備輸入輸出得函數時,在參數前沒有添加「&」符號。代碼以下:
import Foundation
func swapTwoInt(inout number1: Int, inout number2: Int) {
……
}
var a=2
var b=3
……
swapTwoInt(a, b)
……
因爲在函數,調用時沒有在參數前添加「&」符號,致使程序出現瞭如下的錯誤本文選自Swift1.2語言快速入門v2.0:
Passing value of type 'Int' to an inout parameter requires explicit '&'
注意:在Swift 1.2中有一個新的屬性「@noescape 」能夠用在函數中,這意味着這個參數是惟一可被調用的(或者用在函數調用時以參數的方式出現),其意思是它的生命週期比函數調用的週期短,這有助於一些小的性能優化本文選自Swift1.2語言快速入門v2.0。