Swift中的閉包表達式很靈活,其標準語法格式以下:
{ (參數列表) ->返回值類型 in
語句組
}
其中,參數列表與函數中的參數列表形式同樣,返回值類型相似於函數中的返回值類型,但不一樣的是後面有in關鍵字。
Swift提供了多種閉包簡化寫法,這一節咱們將介紹幾種不一樣的形式。
1.類型推斷簡化
類型推斷是Swift的強項,Swift能夠根據上下文環境推斷出參數類型和返回值類型。如下代碼是標準形式的閉包:
{(a:Int, b:Int) -> Int in
return a + b
}
Swift能推斷出參數a和b是Int類型,返回值也是Int類型。簡化形式以下:
{a, b in return a + b }
使用這種簡化方式修改後的示例代碼以下:
php
[html] view plaincopyhtml
func calculate(opr :String)-> (Int,Int)-> Int { swift
var result : (Int,Int)-> Int 微信
switch (opr) { 閉包
case "+" : 函數
result = {a, b in return a + b } ① 網站
default: spa
result = {a, b in return a - b } ② .net
} orm
return result;
}
let f1:(Int,Int)-> Int = calculate("+")
println("10 + 5 = \(f1(10,5))")
let f2:(Int,Int)-> Int = calculate("-")
println("10 + 5 = \(f2(10,5))")
上述代碼第①行和第②行的閉包是上一節示例的簡化寫法,其中a和b是參數,return後面是返回值。怎麼樣?很簡單吧?
2.隱藏return關鍵字
若是在閉包內部語句組只有一條語句,如return a + b等,那麼這種語句都是返回語句。前面的關鍵字return能夠省略,省略形式以下:
{a, b in a + b }
使用這種簡化方式修改後的示例代碼以下:
[html] view plaincopy
func calculate(opr :String)-> (Int,Int)-> Int {
var result : (Int,Int)-> Int
switch (opr) {
case "+" :
result = {a, b in return a + b } ①
default:
result = {a, b in return a - b } ②
}
return result;
}
上述代碼第①行和第②行的閉包return關鍵字省略了,須要注意的是,省略的前提是閉包中只有一條return語句。下面這樣有多條語句是不容許的。
{a, b in var c; a + b }
3.縮寫參數名稱
上一節介紹的閉包表達式已經很簡潔了,不過,Swift的閉包還能夠再進行簡化。Swift提供了參數名稱縮寫功能,咱們能夠用$0、$一、$2來表示調用閉包中參數,$0指代第一個參數,$1指代第二個參數,$2指代第三個參數,以此類推$n+1指代第n個參數。
使用參數名稱縮寫,還能夠在閉包中省略參數列表的定義,Swift可以推斷出這些縮寫參數的類型。此外,in關鍵字也能夠省略。參數名稱縮寫以後以下所示:
{$0 + $1}
使用參數名稱縮寫修改後的示例代碼以下:
[html] view plaincopy
func calculate(opr :String)-> (Int,Int)-> Int {
var result : (Int,Int)-> Int
switch (opr) {
case "+" :
result = {$0 + $1} ①
default:
result = {$0 - $1} ②
}
return result;
}
let f1:(Int,Int)-> Int = calculate("+")
println("10 + 5 = \(f1(10,5))")
let f2:(Int,Int)-> Int = calculate("-")
println("10 + 5 = \(f2(10,5))")
上述代碼第①行和第②行的閉包採用了參數名稱縮寫。
4.使用閉包返回值
閉包表達本質上是函數類型,是有返回值的,咱們能夠直接在表達式中使用閉包的返回值。從新修改add和sub閉包,示例代碼以下:
[html] view plaincopy
let c1:Int = {(a:Int, b:Int) -> Int in
return a + b
}(10,5) ①
println("10 + 5 = \(c1)")
let c2:Int = {(a:Int, b:Int) -> Int in
return a - b
}(10,5) ②
println("10 - 5 = \(c2)")
上述代碼有兩個表達式,第①行代碼是給c1賦值,後面是一個閉包表達式。可是閉包表達式不能直接賦值給c1,由於c1是Int類型,須要閉包的返回值。這就須要在閉包結尾的大括號後面接一對小括號(10,5),經過小括號(10,5)爲閉包傳遞參數。第②行代碼也是如此。經過這種方法能夠爲變量和常量直接賦值,在有些場景下使用很是方便。
更多內容請關注國內第一本Swift圖書《Swift開發指南》
本書交流討論網站:http://www.51work6.com/swift.php
歡迎加入Swift技術討論羣:362298485
歡迎關注智捷iOS課堂微信公共平臺