前言
Swift中的函數和OC中的函數,還是有很大的改變,下面我們來簡單的了解一下Swift中的函數
函數.png
- 函數的格式
func 函數名稱(參數列表) -> 返回值 {
執行代碼
}
函數名稱(傳入的參數) // 這里表示調用代碼, 必須調用函數,才會執行函數中的代碼
函數的幾種形式
1, 沒有參數,沒有返回值
2, 有參數,沒有返回值
3, 有參數, 有返回值
4, 沒有參數,有返回值
- 沒有返回值,沒有參數
/**
* OC寫法
*/
// (void)say {NSLog(@"HelloWorld")}
/**
* Swift寫法
*/
// 方式一: 返回值是Void
func say() -> Void {
print("HelloWorld")
}
// 調用函數
say()
// 方式二: 用()代替Void
func say2() -> () {
print("HelloWorld")
}
say2()
// 方式三: 不管是()還是Void都可以省略掉(包括 ->) 推薦寫法
func say3() {
print("HelloWorld")
}
say3()
- 有參數,沒有返回值
/**
* OC寫法
*/
// (void)sum:(int)a b:(int)b{NSLog(@"%d", a+b)}
/**
* Swift寫法 ,在Swift2.0之后,系統會自動將形參列表中的第二個參數的名稱作為對應參數的標簽,主要是提高閱讀性,當然可以設置從第
* 一個參數開始,也可以將兩個參數的標簽省略
*/
// 方式一: 系統默然標簽樣式(第一個參數沒有標簽,第二個參數有標簽)
func sum(a:Int, b:Int) {
print(a + b)
}
sum(10, b: 20)
// 方式二: 讓所有參數都有標簽(即: 添加外部參數:x,y就是外部參數) 推薦寫法
func sum2(x a: Int, y b:Int) {
print(a + b)
}
sum2(x: 20, y: 30)
// 方式三: 省略所有參數的標簽
func sum3(a:Int, _ b:Int){
print(a + b)
}
sum3(30, 40)
// 方式四:在Swift之前, 如果我們在參數前面添加#, 那么a和b即是外部參數,也是內部參數
// 注意一點,這是Swift2.0之前的寫法,在2.0之后就不能用了
//func sum4(#a: Int, #b: Int) {
//print(a+b)
//}
//sum4()
注意: 在代碼中需要注意外部函數和內部函數
- 有參數,有返回值
func sum4(x a: Int, y b: Int) -> Int {
return a + b
}
sum4(x: 10, y: 20)
- 有返回值,但是沒有參數
func sum5() -> Int {
return 15
}
print(sum5())
- 默認參數
所謂的默認參數,就是如果你指定了某個形參的默認值, 那么在調用方法的時候就可以不用傳遞數據,如果不傳遞數據,那么就會使用默認值,如果傳人了新的參數,那么就使用新傳遞的值. 一般情況下默認值只能寫在最后的位置的,但是Swift可以寫在不行參列表中的任意位置,建議寫在最后.
注意點: 默認值可以寫在任意位置
func tureString(str1: String, str2: String, str3: String = "愛音樂") -> String {
return str1 + str2 + str3 // 拼接字符串
}
tureString("我", str2: "就是") // 使用默認值
tureString("我", str2: "就是", str3: "愛跳舞") // 不適用默認值
常量參數, 變量參數以及inout參數
- 常量參數
// 默認是常量參數, 不能再函數中修改參數的值
func swap(x a: Int, y b: Int)
{
// 數據交換
let temp = a
a = b // 在這里Xcode會提示錯誤, 因為參數都是常量,初始化之后就不能再改變其值了
b = temp
}
swap(x: 10, y: 20)
- 變量參數
func swap(var a: Int,var b: Int) // Xcode提示警告: 用var修飾形參列表中的參數已經在Swift3.0中廢棄了,具體我去查查,再來修改
{
print("a=\(a), b=\(b)")
// 數據交換
let temp = a
a = b // 在這里Xcode會提示錯誤, 因為參數都是常量,初始化之后就不能再改變其值了
b = temp
print("a=\(a), b=\(b)")
}
swap(10, b: 20)
- inout參數
在OC中, 函數中修改形參的值是不會影響到外部實參的值, 因為是它是值傳值, 如果形參是變為指針或者地址,那么就是址傳值可以影響外部實參的值.
同樣,在Swift中,改變函數內部的參數的值是不會影響到外部實參的值, 如果我我們想要做到影響外部實參的值,我們可以使用inout參數
func swap3(var m: Int,var n: Int) // Xcode提示警告: 用var修飾形參列表中的參數已經在Swift3.0中廢棄了,具體我去查查,再來修改
{
print("m=\(m), n=\(n)")
// 數據交換
let temp = m
m = n // 在這里Xcode會提示錯誤, 因為參數都是常量,初始化之后就不能再改變其值了
n = temp
print("a=\(m), b=\(n)")
}
var x = 30
var y = 40
print("x=\(x), y=\(y)")
swap3(x, n: y)
print("x=\(x), y=\(y)")
// inout參數是地址傳遞
func swap2(inout a: Int,inout b: Int) // Xcode提示警告: 用var修飾形參列表中的參數已經在Swift3.0中廢棄了,具體我去查查,再來修改
{
print("a=\(a), b=\(b)")
// 數據交換
let temp = a
a = b // 在這里Xcode會提示錯誤, 因為參數都是常量,初始化之后就不能再改變其值了
b = temp
print("a=\(a), b=\(b)")
}
var x1 = 30
var y1 = 40
print("x=\(x1), y=\(y1)")
swap(&x1, &y1)
print("x=\(x1), y=\(y1)")
- 總結:
- 1, 在默認情況下,行參列表中的所有參數都是常量參數, 不能在函數中修改參數的值
- 2, 如果想要在函數中修改形參的值,那么必須在形參列表中將常量參數,變為變量參數
- 3, 和OC一樣, 在函數中修改形參額值,是不會影響到外部實參的值
- 4, 如果想要在函數中修改形參的值,并且能夠影響到外部實參的值,那么可以將形參列表中的參數變為inout參數