Swift基礎(chǔ)學(xué)習(xí)2(函數(shù)和閉包)

函數(shù)

swift中函數(shù)與C語言中函數(shù)表現(xiàn)形式上沒有太大區(qū)別,同時(shí)內(nèi)外部參數(shù)的表現(xiàn)形式與OC邏輯相同,微小差異 : 元組概念為swift函數(shù)提供了多返回值的便捷使用方式

內(nèi)外參數(shù)分別聲明

func test(num1 num:Int) -> (Int) {
        return num * 100 // 內(nèi)參數(shù)是num
    }

var value = test(num1: 100)  //調(diào)用時(shí)用外參數(shù)

普通函數(shù)表現(xiàn)形式---未標(biāo)注內(nèi)外參數(shù)時(shí)默認(rèn)相同
此種形式在原來版本需要在內(nèi)參數(shù)前加上# 表明內(nèi)外參數(shù)名相同

//定義一個(gè)函數(shù),注意參數(shù)和返回值,如果沒有返回值可以不寫返回值或者寫成Void、空元組()(注意Void的本質(zhì)就是空元組)
func sum(num1:Int,num2:Int)->Int{
    return num1 + num2
}

let value = sum(num1: 23, num2: 42)//函數(shù)的調(diào)用

有默認(rèn)值的函數(shù)

func sum(num1:Int,num2:Int = 100)->Int{
    return num1 + num2
}
let value = sum(num1: 23)
let value = sum(num1: 23, num2: 42)

可變參數(shù),一個(gè)函數(shù)最多有一個(gè)可變參數(shù)并且作為最后一個(gè)參數(shù)

下面strings參數(shù)在內(nèi)部是一個(gè)[String],對于外部是不定個(gè)數(shù)的String參數(shù)

func joinStr(seperator:Character=",",strings:String...)->String{
    var result:String=""
    for var i=0;i<strings.count;++i{
        if i != 0{
            result.append(seperator)
        }
        result+=strings[i]
    }
    return result
}
 
joinStr(seperator:" ", "hello","world","!") //結(jié)果:"hello world !"

默認(rèn)內(nèi)參數(shù)為let類型,如果需要變化需要用var

func sum(num1:Int,num2:Int = 100)->Int{
    var num1 = num1 //默認(rèn)內(nèi)參數(shù)為let類型,如果需要變化需要用var
    num1 += 1
    return num1 + num2
}

inout參數(shù) : 內(nèi)部可以改變外部參數(shù) (調(diào)用時(shí)候必須傳入變量)

func inoutTest(inout num1: Int) -> () {  //swift3.0之前寫法
        
    }
func inoutTest(num1:inout Int) -> () {  //3.0以后寫法
        
    }

作為參數(shù)和返回值

var sum3=sum //自動(dòng)推斷sum3的類型:(Int,Int)->Int,注意不同的函數(shù)類型之間不能直接賦值
sum3(1,2) //結(jié)果:3
 
//函數(shù)作為返回值
func fn()->(Int,Int)->Int{
    //下面的函數(shù)是一個(gè)嵌套函數(shù),作用于是在fn函數(shù)內(nèi)部
    func minus(a:Int,b:Int)->Int{
        return a-b
    }
    return minus;
}
var minus=fn()
 
//函數(shù)作為參數(shù)
func caculate(num1:Int,num2:Int,fn:(Int,Int)->Int)->Int{
    return fn(num1,num2)
}
 
caculate(1, 2, sum) //結(jié)果:3
caculate(1,2, minus) //結(jié)果:-1

閉包

  • 全局函數(shù)和嵌套函數(shù)也是一種閉包,對于全局函數(shù)它不會(huì)捕獲任何常量或者變量,而對于嵌套函數(shù)則可以捕獲其所在函數(shù)的常量或者變量。
  • 通常我們說的閉包更多的指的是閉包表達(dá)式,也就是沒有函數(shù)名稱的代碼塊,因此也稱為匿名閉包。
  • 簡化使用形式稱之為尾隨閉包
func caculate(num1:Int,num2:Int,fn:(Int,Int)->Int)->Int{
    return fn(num1,num2)
}

caculate(a, b, {(num1:Int,num2:Int)->Int in
    return num1 - num2
}) 
//常用以下方式來使用,稱之為`尾隨閉包`
//再次簡化,使用參數(shù)名縮寫,使用$0...$n代表第n個(gè)參數(shù),并且此in關(guān)鍵字也省略了
caculate(a, b, {
    return $0 - $1
})
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容