Swift 基础学习(闭包)
2016-03-04 13:29
423 查看
/* (1)闭包的概念和分类 自包含的函数代码块 全局函数 (有名) 闭包表达式 (匿名) -- 能补货上下文中的常量或者变量 嵌套函数 (*) */ /* (2)闭包表达式的语法 //函数表达式 func funcName(参数) -> 返回值类型 { 执行语句 } //闭包表达式 { (参数) -> 返回值类型 in 执行语句 } */ //无参无返回值的闭包表达式 let sayHello = { print("hello World") } sayHello() //有参数有返回值 let add: (Int, Int) -> Int = { (a: Int, b: Int) -> Int in return a + b } print(add(1, 8)) /* (3)闭包表达式回调用法 */ //对数组进行排序 var array = [23,2,5,89,56] func showArray (array: [Int]) { for x in array { print("\(x) ") } } func bubbleSort(inout array: [Int]) { let cnt = array.count for var i = 1; i < cnt; i++ { for var j = 0; j < cnt-i; j++ { if (array[j] > array[i]){ let t = array[j] array[j] = array[j+1] array[j+1] = t } } } } showArray(array) bubbleSort(&array) showArray(array) //闭包表达式作为bubbleSort1一个函数的实参直接传递给函数 func bubbleSort1(inout array: [Int],cmp:(Int, Int) -> Int) { let cnt = array.count for var i = 1; i < cnt; i++ { for var j = 0; j < cnt-i; j++ { if (cmp(array[j], array[j+1]) == -1){ let t = array[j] array[j] = array[j+1] array[j+1] = t } } } } let intCmp = { (a: Int, b: Int) -> Int in if a > b { return -1 }else if a < b { return 1 }else{ return 0 } } bubbleSort1(&array, cmp: intCmp) showArray(array) //如果按照个位数大小进行排序,只需修改闭包里面的方法即可 let intCmp1 = { (a: Int, b: Int) -> Int in let x = a % 10, y = b % 10 if x > y { return -1 }else if x < y { return 1 }else{ return 0 } } bubbleSort1(&array, cmp: intCmp1) showArray(array) /* 闭包表达式语法的优化 */ //可以省略参数的类型,前提是在bubbleSort1函数中已经声明过类型,这里利用Swift的编译推断机制 bubbleSort1(&array) { (a, b) in let x = a % 10, y = b % 10 if x > y { return -1 }else if x < y { return 1 }else{ return 0 } } showArray(array) //也可以优化为如下 bubbleSort1(&array) { //第一个参数用$0表示,后面的参数一次类推 let x = $0 % 10, y = $1 % 10 if x > y { return -1 }else if x < y { return 1 }else{ return 0 } } showArray(array) /* (5)尾随闭包 */ //使用系统方法排序 var array1 = [5,2,56,23,90,67] //降序 array1.sortInPlace { (a, b) -> Bool in return a > b } showArray(array1) //升序 array1.sortInPlace { $0 < $1 } showArray(array1) /* (6)嵌套函数:在函数内部定义实现的函数 */ func bubbleSortFunc(inout array: [Int]) { let cnt = array.count //可以在函数的内部声明一个函数,作用域从它定义的开始到它所在函数的结束,仅仅为该函数服务; func swapValue(inout a:Int, inout b:Int){ //内部可以访问bubbleSortFunc函数内部定义的局部变量 print("数组个数\(cnt)") let t = a a = b b = t } for var i = 1; i < cnt; i++ { for var j = 0; j < cnt-i; j++ { if (array[j] > array[j+1]){ swapValue(&array[j], b: &array[j+1]) } } } } var array2 = [3,6,23,56,2,7] bubbleSortFunc(&array2) showArray(array2) /* (7)闭包捕获值 */ //定义一个有参函数,返回值为一个闭包 func getIncFunc(inc: Int) -> (Int) -> Int { func incFunc(v: Int) -> Int { //inc是在外部定义的 return inc + v } return incFunc } let incFunc1 = getIncFunc(3) //inc = 3,v = 10,结果是13 print(incFunc1(10)) func getIncFunc1(inc: Int) -> (Int) -> Int { var mt = 10 func incFunc(v: Int) -> Int { //mt为外部变量,incfunc可以捕获该值 mt++ return inc + v + mt } return incFunc } let incFunc2 = getIncFunc1(3) //v=10,inc=3,mt=11,结果24 print(incFunc2(10)) //v=10,inc=3,mt=12此时记录了mt上次的值11,mt++之后变为12,结果为25;IncFunc捕获了mt值 print(incFunc2(10)) func getIncFunc2(inc: Int) -> (Int) -> Int { func incFunc(v: Int) -> Int { //声明为一个内部时,两次结果都是24 var mt = 10 mt++ return inc + v + mt } return incFunc } let incFunc3 = getIncFunc2(3) let incFunc4 = getIncFunc2(3) print(incFunc3(10)) print(incFunc3(10)) //每个返回的闭包都是独立,所以说mt并不会相互的受影响 print(incFunc4(10))
相关文章推荐
- Swift - 使用CoreLocation获取设备方向(真实方向,磁极方向)(转帖)
- 《从零开始学Swift》学习笔记(Day 50)——扩展计算属性、方法
- 《从零开始学Swift》学习笔记(Day 49)——扩展声明
- 《从零开始学Swift》学习笔记(Day48)——类型检查与转换
- 《从零开始学Swift》学习笔记(Day 47)——final关键字
- 《从零开始学Swift》学习笔记(Day 46)——下标重写
- Swift语言iOS8的蓝牙Bluetooth解析(转帖)
- 《从零开始学Swift》学习笔记(Day 45)——重写方法
- 《从零开始学Swift》学习笔记(Day 44)——重写属性
- 《从零开始学Swift》学习笔记(Day43)——构造函数继承
- 《从零开始学Swift》学习笔记(Day 42)——构造函数调用规则
- 《从零开始学Swift》学习笔记(Day 41)——类的继承
- iOS开发swift--函数
- swift学习笔记-----swift中的指针
- Swift教程17-淡化MVC,使用MVVM框架开发轻巧便于维护的iOS app
- XCode7添加自定义framework 比如加入swiftjson.framework框架后运行真机出现dyld: Library not loaded的解决方法
- 写在新书《Swift开发手册:技巧与实战》出版之际
- swift:基本数据类型
- 错误处理与异常抛出_Swift基础知识学习
- 获取对象类型(swift)