发布于 2015-12-28 22:34:02 | 107 次阅读 | 评论: 0 | 来源: 网友投递

这里有新鲜出炉的Swift教程,程序狗速度看过来!

Swift编程语言

SWIFT,苹果于2014年WWDC(苹果开发者大会)发布的新开发语言,可与Objective-C*共同运行于Mac OS和iOS平台,用于搭建基于苹果平台的应用程序。


1、概念

闭包是一个自包含的功能模块,可以在代码中被传递和使用。
闭包可以捕获和存储其所在上下文中任意常量和变量的引用。Swift 会为你管理在捕获过程中涉及到的内存操作。

2、闭包的三种形式

  • 全局函数(有函数名,不会捕获任何值)
  • 嵌套函数(有函数名,可以在其封闭的函数中捕获值)
  • 闭包表达式(没有名字,利用轻量级的语法在其围绕的上下文中捕获值)
 
 
  1. // 1、全局函数实现闭包  
  2. let names = ["Chris""Alex""Ewa""Barry""Daniella"]  
  3. func backwards(s1: String, s2: String) -> Bool {  
  4.     return s1 > s2  
  5. }  
  6. var reversed = sorted(names, backwards)  
  7.   
  8. // 2、嵌套函数实现闭包  
  9. func makeIncrementor(forIncrement amount: Int) -> () -> Int {  
  10.     var runningTotal = 0  
  11.     func incrementor() -> Int {  
  12.         runningTotal += amount  
  13.         return runningTotal  
  14.     }  
  15.     return incrementor  
  16. }  
  17.   
  18. // 3、闭包表达式实现闭包  
  19. reversed = sorted(names, { (s1: String, s2: String) -> Bool in return s1 > s2 } )  

3、闭包表达式

(1)语法形式

 
 
  1. { (parameters) -> return type in  
  2.     statements  
  3. }  

(2)闭包表达式的优化

  • 利用上下文推断参数和返回值类型
  • 单行闭包表达式可以省略 return 关键字
  • 参数名简写(Swift 自动为内联闭包提供了参数名称简写功能,你可以直接通过 $0,$1,$2 等名字来引用的闭包的参数的值)
  • 尾随闭包
 
 
  1. // 1、原始方式  
  2. let names = ["Chris""Alex""Ewa""Barry""Daniella"]  
  3. func backwards(s1: String, s2: String) -> Bool {  
  4.     return s1 > s2  
  5. }  
  6. var reversed = sorted(names, backwards)  
  7.   
  8. // 2、闭包表达式  
  9. reversed = sorted(names, { (s1: String, s2: String) -> Bool in return s1 > s2 } )  
  10.   
  11. // 3、闭包表达式利用上下文推断参数和返回值类型  
  12. reversed = sorted(names, { s1, s2 in return s1 > s2 } )  
  13.   
  14. // 4、闭包表达式单行可以省略 return  
  15. reversed = sorted(names, { s1, s2 in s1 > s2 } )  
  16.   
  17. // 5、闭包表达式参数名简写  
  18. reversed = sorted(names, { $0 > $1 } )  
  19.   
  20. // 6、闭包表达式运算符函数  
  21. reversed = sorted(names, >)  
  22.   
  23. // 7、尾随闭包方式  
  24. reversed = sorted(names) { $0 > $1 }  

注意:在最新的 Xcode 版本中运行上述代码会有部分语句识别不了">"的情况,报ambiguous use the operator 错误,这很可能是 Xcode 或者 Swift 暂时还不稳定造成,与语法本身无关。

4、尾随闭包(Trailing Closures)

如果你需要将一个很长的闭包表达式作为最后一个参数传递给函数,可以使用尾随闭包来增强函数的可读性。
尾随闭包是一个书写在函数括号之外的闭包表达式,函数支持将其作为最后一个参数调用。
注意:如果函数只有闭包表达式一个参数,当你使用尾随闭包时,你甚至可以把“()”省略掉。

 
  1. let digitNames = [  
  2.     0"Zero", 1"One", 2"Two",   3"Three", 4"Four",  
  3.     5"Five", 6"Six", 7"Seven", 8"Eight", 9"Nine"  
  4. ]  
  5. let numbers = [1658, 510]  
  6. let strings = numbers.map {  
  7.     (var number) -> String in  
  8.     var output = ""  
  9.     while number > 0 {  
  10.         output = digitNames[number % 10]! + output  
  11.         number /= 10  
  12.     }  
  13.     return output  
  14. }  
  15. println(strings)  
  16. // prints "["OneSix", "FiveEight", "FiveOneZero"]"  

5、捕获(Caputure)

闭包可以在其定义的上下文中捕获常量或变量。
即使定义这些常量和变量的原作用域已经不存在,闭包仍然可以在闭包函数体内引用和修改这些值。

  1. func makeIncrementor(forIncrement amount: Int) -> () -> Int {  
  2.     var runningTotal = 0  
  3.     func incrementor() -> Int {  
  4.         runningTotal += amount  
  5.         return runningTotal  
  6.     }  
  7.     return incrementor  
  8. }  
  9. let incrementByTen = makeIncrementor(forIncrement: 10)  
  10. incrementByTen()            // 10  
  11. incrementByTen()            // 20  
  12. let incrementBySeven = makeIncrementor(forIncrement: 7)  
  13. incrementBySeven()          // 7  
  14. incrementByTen()            // 30  

incrementor 函数并没有任何参数,但是在函数体内访问了 runningTotal 和 amount 变量。这是因为其通过捕获包含它的函数体内已经存在的 runningTotal 和 amount 变量而实现的。
由于没有修改 amount 变量,incrementor 实际上捕获并存储了该变量的一个副本,而该副本随着 incrementor 一同被存储。
然而,因为每次调用该函数的时候都会修改 runningTotal 的值,incrementor 捕获了当前 runningTotal 变量的引用,而不是仅仅复制该变量的初始值。捕获一个引用保证了当 makeIncrementor 结束时候并不会消失,也保证了当下一次执行 incrementor 函数时,runningTotal 可以继续增加。

6、闭包是引用类型

  1. let alsoIncrementByTen = incrementByTen  
  2. alsoIncrementByTen()        // 40  


最新网友评论  共有(0)条评论 发布评论 返回顶部

Copyright © 2007-2017 PHPERZ.COM All Rights Reserved   冀ICP备14009818号  版权声明  广告服务