標籤:swift函數閉包
一、閉包的概念
電腦語言要支援閉包的前提條件有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(”李四“)))
本文出自 “平凡之路” 部落格,請務必保留此出處http://linjohn.blog.51cto.com/1026193/1620594
Swift函數閉包