《swift從入門到精通》(二):函數(shù)

函數(shù)相關(guān)鏈接

函數(shù)的定義

  1. 常見的定義函數(shù)的方式
1, num1和num2表示的形參的內(nèi)部函數(shù)名
func sum(num1: Int,  num2: Int) -> Int {
   return num1+num2
}
let su = sum(num1:10, num2: 20)

2,在開發(fā)過程中往往會給形參設(shè)置一個名詞, 這樣不能大大提高函數(shù)的可讀性, a和b就是形參的外部函數(shù)名
func sum( a num1: Int, b num2: Int) -> Int {
   return num1+num2
}
let su = sum(a: 10, b: 20)
3,這種方式也是我在開發(fā)中常用的一種方式,直接在形參前面使用下劃線“_”, 這樣就會把函數(shù)名直接隱藏掉,有點(diǎn)是可使代碼看起來更加簡潔,方便
func sum( _ num1: Int, _ num2: Int) -> Int {
   return num1+num2
}
let su = sum(10,  20)

注意:
函數(shù)中定義形參默認(rèn)是let類型,所以不能直接去修改形參的值,如果需要修稿就使用inout關(guān)鍵字

如:
錯誤寫法: num默認(rèn)是let類型,不能直接修改參數(shù)的值,這樣寫會報錯
func sum(num: Int) {
  number += 1
}
var num3: Int = 5
sum(num: &num3) 
報錯:
error: block.playground:11:9: error: left side of mutating operator isn't mutable: 'num' is a 'let' constant
    num += 3
    ~~~ ^

正確寫法:使用關(guān)鍵字 inout 指向的是內(nèi)存地址, 相當(dāng)于C語言的&地址符號
func sum(num:inout Int) {
  num += 1
}
var num3: Int = 5
sum(num: &num3) // 結(jié)果是6
  1. 默認(rèn)參數(shù)
//默認(rèn)參數(shù)值
func check(name: String = "nobody", age: Int, job: String = "noe"){
    print("name=\(name), age=\(age), job=\(job)")
}
check(name: "Jack", age: 20, job: "Doctor")// name=Jack, age=20, job=Doctor
check(name: "jack", age: 10)
check(age: 10, job: "batom")
check(age: 15)

c++的默認(rèn)參數(shù)有個限制:必須從右往左設(shè)置。由于seigt有參數(shù)標(biāo)簽,因此并沒有此類限制,但是在省略參數(shù)標(biāo)簽時,需要特別注意,避免出錯

//這里的middle不能省略參數(shù)標(biāo)簽
func test(_ first: Int = 10, middle: Int, _ last: Int = 30){
    
}
test(middle: 20)
  1. 可變參數(shù)
func sum(_ numbers: Int...) -> Int{
    var sum = 0
    
    for number in numbers {
        sum += number
    }
   return sum
}
sum(10, 20, 30, 40) //100
  • 一個函數(shù)最多只能有1個可變參數(shù)
  • 緊跟在可變參數(shù)后面的參數(shù)不能省略參數(shù)標(biāo)簽
//參數(shù)string不能省略標(biāo)簽
func test(_ numbers: Int..., string: String, _ other: String){}
test(10, 20, 30, string: "jack", "aaa")

4.輸入輸出參數(shù)(inout)
可以用inout定義一個輸入輸出參數(shù):可以在函數(shù)內(nèi)部修改外部實(shí)參的值

func swapValues(_ v1: inout Int, _ v2: inout Int){
    (v1, v2) = (v2, v1)
}
var a = 10
var b = 20
swapValues(&a, &b)
  1. 可變參數(shù)不能標(biāo)記為inout
  2. inout參數(shù)不能有默認(rèn)值
  3. inout參數(shù)只能傳入可以被多次賦值的
  4. inout參數(shù)的本質(zhì)是地址傳遞
  1. 函數(shù)重載
  • 函數(shù)名相同
  • 參數(shù)個數(shù)不同||參數(shù)類型不同||參數(shù)標(biāo)簽不同
func sum(v1: Int, v2: Int) -> Int {
    v1 + v2
}

func sum(v1: Int, v2: Int, v3: Int) -> Int {
    v1 + v2 + v3
}//參數(shù)個數(shù)不同

func sum(v1: Double, v2: Int) -> Double {
    v1 + Double(v2)
}//參數(shù)類型不同

func sum(a: Int, v2: Int) -> Int {
    a + v2
}//參數(shù)標(biāo)簽不同

注意點(diǎn)

  1. 返回值類型與函數(shù)重載無關(guān)
  2. 默認(rèn)參數(shù)值和函數(shù)重載一起使用產(chǎn)生二義性時,編譯器并不會報錯
    3.可變參數(shù)、省略參數(shù)標(biāo)簽、函數(shù)重載一起使用產(chǎn)生二義性時,編譯有可能會報錯

6.函數(shù)類型
每一個函數(shù)都有類型的,函數(shù)類型由形式參數(shù)類型、返回值類型組成

func test() {} // () ->Void 或 ()-> ()
func sum(a: Int, b: Int) -> Int {
    a +  b
} //(Int, Int) -> Int
var fn: (Int, Int) -> Int = sum
fn(2, 3)//調(diào)用時不需要參數(shù)標(biāo)簽
  • 函數(shù)類型作為函數(shù)參數(shù)
func sum(v1: Int, v2: Int) -> Int {
    v1 + v2
}
func difference(v1: Int, v2: Int) -> Int {
    v1 - v2
}
func printResult(_ fn: (Int, Int) -> Int, a: Int, b: Int) {
    print("Result: \(fn(a, b))")
}
printResult(sum, a: 10, b: 20)
printResult(difference, a: 10, b: 20)
  • 函數(shù)類型作為函數(shù)返回值
func next(_ input: Int) -> Int {
    input + 1
}
func previous(_ input: Int) -> Int {
    input - 1
}
func forword(_ forword: Bool) -> (Int) -> Int {
    forword ? next : previous
}
forword(true)(3)
forword(false)(4)

7.高階函數(shù)
返回值是函數(shù)類型的函數(shù),叫做高階函數(shù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容