Swift基礎語法09-- 函數

前言

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參數
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容