Swift: 7.1 函數基礎
函數一段用來處理特定任務的自包含代碼。通過給這段代碼加上命名標識,就可以通過調用這個函數名字來執行這段代碼。Swift的函數語法非常靈活,既可以用來表示不帶參數名的簡單的C樣式的函數,還可以表示帶局部和外部參數名的復雜的Objective-C樣式的函數。
函數定義和調用
Swift中的函數的聲明組成跟其他語言一樣,即包含關鍵字、函數名、參數列表、返回值和函數體。區別在于寫法上有所差別。
func sayHello(name:String) -> String {
return "Hello, " + name + "!"
}
上面兩行代碼定義了一個sayHello函數,以func關鍵字開頭,參數列表以名稱、類型對的方式組成,右箭頭指定了函數的返回值的類型。函數定義完成后可以通過如下形式調用。
//把返回值賦給一個常量
let str = sayHello(name: "Amy")
print(str)
//直接在print函數里面調用
print(sayHello(name: "Bry"))
函數形參和返回值
- 與Objective-C類似,函數可以沒有形參沒有返回值,也可以有多個形參,不過,Swift函數還可以有多個返回值,多個返回值是元組的樣式(x,y)。下面代碼演示不同類型形參和返回值的函數。
//多個參數
func maxInt(a: Int, b: Int)-> Int{
return a > b ? a :b
}
print(maxInt(a:2,b:1)) //輸出2
//無形參、無返回值
func printConst(){
print("I'm constant~")
}
printConst()
//多個返回值
func getPoint()-> (Int, Int){
return (1,1)
}
let (x,y) = getPoint()
print("(\(x),\(y))")
- Swift繼承了Objective-C為參數命名外部形參名的做法,在內部形參名前面可以加一個外部調用的標識。默認的,如果不指定外部形參名,就用內部形參名進行代替。
//不指定外部形參名
func someFunction(first: Int, second: Int) {
}
someFunction(first: 1, second: 2)
//指定外部形參名 argumentLabel
func someFunction1(argumentLabel parameterName: Int) {
}
someFunction1(argumentLabel: 1)
- 可以使用下劃線(_)作為占位符,來忽略外部形參名,這樣在調用的時候,就可以不用在參數前面加上外部形參名。注意,如果有外部形參名,在函數調用時候必須要帶上。
func someFunction(_ first: Int, second: Int) {
}
someFunction(1, second: 2)
- 與Objective-C語言類似,Swift函數還可以給函數參數設置默認值,如果設置了默認值,在函數調用的時候,可以忽略這個參數。
func someFunction(first: Int, withDefault: Int = 12) {
}
someFunction(first: 3, withDefault: 6) // withDefault的值是12
someFunction(first: 4) // withDefault 的值是 12
- 同樣的,函數還可以有可變形參,也就是參數可以為0到多個相同類型的值。只要在參數名后面插入(...)即可創建可變形參。函數中最多只能有一個形參。
func sumNum(_ numbers: Double...) -> Double {
var total: Double = 0
for number in numbers {
total += number
}
return total
}
sumNum(1, 2, 3, 4, 5)
// 返回值15是上面幾個數之和
sumNum(3, 8.25, 18.75)
// 返回上面幾個數的和30
- 默認情況下函數的參數都是常量,如果在函數的內部嘗試著去改變形參的值的話,編譯器會報錯。如果想要改變形參的值的話,就在參數的前面加上inout關鍵字,函數調用的時候,實參的前面加上(&)符合即可,表示的是傳遞過去一個指針。
func swapInt(_ a: inout Int, _ b: inout Int) {
let temporaryA = a
a = b
b = temporaryA
}
var one = 1
var two = 2
swapInt(&one,&two)
print("現在兩個值是\(one),\(two)")
//打?。含F在兩個值是2,1
演示示例
下面示例代碼演示了函數的定義和使用,函數形參和返回值的各種用法。
func concat(_ prefix: inout String, nums:Int...)->(str:String,count:Int){
for num in nums {
prefix += String(num) + " "
}
return (prefix,nums.count)
}
var str = "Hello "
var num1 = 9
var num2 = 8
var num3 = 7
// 字符串的操作是值拷貝
var returnStr = concat(&str, nums: num1,num2,num3)
print(str) //函數外的值被函數改變
print(returnStr) //返回的元組
returnStr.str += "6" //驗證字符串是值拷貝
print(str)
print(returnStr)
運行結果如下截圖。