您好,登錄后才能下訂單哦!
一、閉包的概念
計算機語言要支持閉包的前提條件有2個:
1、支持函數類型,能夠將函數作為參數或返回值傳遞;
2、支持函數嵌套
示例:
func caculate(opr : String)->(Int,Int)->Int {
var result:(Int,Int)->Int
switch(opr){
case "+":
result={(a:Int,b:Int)->Int in
return a+b
}
default:
result = {(a:Int,b:Int) -> Int in
return a - b
}
}
return result;
}
let f1:(Int,Int)->Int = caculate("+")
println(f1(2,5))
通過以上示例,我們可以給Swift的閉包一個定義:閉包是自包含的匿名函數塊,可以作為表達式,函數參數和函數返回值,閉包表達式的運算結果是一種函數類型
Swift的閉包類似于C和Obeject-C的代碼庫,C++和C#的Lamba表達式,JAVE中的內部匿名類
二、閉包的表達式
Swift中的閉包表達式的標準寫法如下:
{(參數列表)->返回值類型 in 語句組}
1、類型推斷簡化
Swift中可以根據上下文環境推斷出參數類型和參數返回值,以下代碼是標準形式的閉包:
{(a : Int, b : Int)-> Int in
return a + b
}
Swift能推斷出參數a和b為Int類型,返回值為Int類型,簡化形式如下:
{a,b in return a + b}
2、隱藏return關鍵字
如果在閉包的內部語句組只有一條語句,如 rerturn a + b,那么這種語句都是返回語句,前面的關鍵字rerturn可以省略,省略形式如下:
{a,b in a + b}
3、縮寫參數名稱
Swift提供了參數名稱縮寫的功能,我們可以用$0,$1,$2,表示調用閉包中的函數,$0表示第一個參數,$1表示第二個參數,以此類推
func caculate(opr : String)->(Int,Int)->Int {
var result:(Int,Int)->Int
swtich opr{
case "+":
result={$1,$2}
default:
result={$1-$2}
}
return result
}
4、使用閉包返回值
閉包表達式本質上是函數類型,是有返回值的,可以在表達式中直接使用閉包的返回值
let c1 :Int = {(a:Int,b:Int)->Int in return a+b}(10,5)
println(c1)
三、使用尾隨閉包
閉包表達式可以作為函數的參數傳遞,閉包必須是最后一個參數的時候才能使用
示例:
func caculate(opr : String,funcN:(Int,Int)->Int){ switch opr{ case "+": println(funcN(10,5)) default: println(funcN(10,5)) } } caculate("+"){(a:Int,b:Int)->Int in return a + b} caculate("-"){(a:Int,b:Int)->Int in return a - b}
四、捕獲上下文中的常量和變量
嵌套函數或閉包可以訪問它所在上下文的變量和常量,這個過程稱之為捕獲值,即便是定義這些變量和常量的原始域已經不存在,嵌套函數或閉包仍然可以在函數體內或閉包體內引用和修改這些值。
示例:
funMakeArray()->String-[String]{ var ary:[String] = [String]() funcAddElement(element:String)->[String]{ ary.append(element) return ary } return addElement } let f1 = funMakeArray() println(f1("張三")) println(f1(”李四“)))
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。