Swift-闭包

Swift 闭包

函数 ()->()

Swift 中的闭包和 Objective-C 中的 block 类似,闭包是功能性自包含模块,可以在代码中被传递和使用。 在 Swift 中 函数只是闭包的一种特殊形式。

1.全局函数是一个有名字但不会捕获任何值的闭包
2.内嵌函数是一个有名字可以捕获到所在的函数域内值的闭包
3.闭包表达式是一个没有名字的可以捕获上下文中的变量或者常量的闭包

定义函数

我们在 Swift 中使用 func 关键字来定义函数,函数可以没有参数和返回值,也可以有一个或者多个参数和返回值。在Swift中多个参数的返回值叫做元组(tuples)

 func foo(firstname:String ,lastname:String)->(fullname:String){
      return("\(firstname) \(lastname)")
 }

函数调用

 let fullname = foo("zhao”,”sunny”)

函数类型

每一个函数都有它的类型,函数的类型由函数本身的参数类型和返回值类型来决定的。

  func sum(x:Int,y:Int) -> (result:Int){return x + Y}

上面这个函数的函数类型就是

  (Int,Int)->(Int)

函数类型在构建函数的时候当成参数类型或者返回值类型来使用。

返回函数类型

func foo()->((String,String) -> String){
   func bar(firstname:String,lastname:String) ->(fullname:String){
    return("\(firstname) \(lastname)")
  }
  return bar
}
let namecombination = foo()
namecombination("wang","er")

可变参数函数

可变参数函数是指函数可以接收不固定个参数。在参数类型后面添加 来标记这个参数为可变参数。我们可以在函数中像访问数组一样访问可变参数。

func foo(names:String...) ->() {
  for name in names {
   println("\(name)")
  }
}
func foo("zhao","zhang","wang")

In-out 参数函数

传入函数的参数值只能在函数域内改变。参数传递是值传递,也就是说我们在函数内部修改了一个参数的值,在函数结束后,函数外部访问到的参数值还是传入函数之前的值,它并没有随着函数内的修改而改变。在Objective-C 我们通过指针来保存函数内修改过的值以供函数结束后外部访问。常见的例子就是 NSError 的使用。
Swift 中我们也可以做类似的操作。我们需要inout 关键字来标记要修改的参数。

func swapTwoInts(inout a: Int, inout b: Int) { 
    let temporaryA = a
     a = b 
        b = temporaryA
 }
 var someInt = 3 
 var anotherInt = 107 
 swapTwoInts(&someInt, &anotherInt)  

闭包 { ()->() in }

定义一个闭包

闭包是一个使用花括号{} 包围起来,并且使用函数类型()->()来定义的代码模块。->符号分割了输入参数和返回值类型。在关键字 in 来区分闭包的头和闭包函数体。

 {(params) -> returnType in 
    statements
 }

一个数组的map闭包的例子

let names = ["zhao","wang","Li"]
names.map({
  (name:String) -> String in 
   "\(name) has been map !"
})

已知参数类型的闭包

map的闭包是作为函数参数传入的,所以 Swift 是可以做类型推断的,这样的话我们就不需要在闭包中在描述闭包的函数类型,也就是我们可以省略 (String) -> (String) 部分,来简写闭包表达式

let names = ["zhao","wang","Li"]
names.map({
  name in 
    "\(name) has been map !"
}) 

如果闭包有返回值我们也可以简写省略掉return

例如

let names = ["zhao","wang","Li"]
let orderNames = sort(names,{s1,s2 in s1 > s2})

闭包参数名简写

Swift 为内联函数提供了参数名称简写功能,您可以直接通过 $0,$1,$2等名字来引用的闭包的参数的值。

let names = ["zhao","wang","Li"]
names.map({"\($0) has been map !"})
sort(names,{$0 > $1})

如果闭包是函数的最后一个参数,我们可以省略掉圆括号

names.map{"\($0) has been map !"}
sort(names){$0 > $1}

对于排序函数 sort() 来说作为参数的闭包表达式只进行了两个值的比较,比较是通过操作符 >来进行的。在Swift中可以进行操作符重载,我们会发现在String 中定义了>的函数实现,也就是 > 本身就是一个函数 ,它接收两个String 类型的参数 并返回一个Bool类型的值。这和 Sort 函数的第二个参数的类型是一致的。所以,我们还可以进一步简写 Sort()

sort(names,>)

闭包跟函数是引用类型

无论您将函数/闭包赋值给一个常量还是变量,您实际上都是将常量/变量的值设置为对应函数/闭包的引用。这也意味着如果您将闭包赋值给了两个不同的常量/变量,两个值都会指向同一个闭包.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容

  • 闭包是功能性自包含模块,可以在代码中被传递和使用。Swift中的闭包与 C 和 Objective-C中的 blo...
    AirZilong阅读 347评论 0 2
  • 闭包是自包含的函数代码块,可以在代码中被传递和使用。Swift 中的闭包与 C 和 Objective-C 中的代...
    穷人家的孩纸阅读 1,690评论 1 5
  • 闭包可以从定义它们的上下文中捕获和存储对任何常量和变量的引用。 这被称为关闭这些常量和变量。 Swift处理所有的...
    Joker_King阅读 582评论 0 2
  • * 闭包 是自包含的函数代码块,可以在代码中被传递和使用。swift中的闭包和Objective-C中的代码块(b...
    EndEvent阅读 850评论 4 8
  • 闭包是自包含的代码块,可以在代码中被传递和使用。Swift中的闭包与C和Objective-C中代码块(block...
    Raaaaamsey阅读 831评论 0 2