swift闭包总结
发布时间:2020-12-14 02:01:01 所属栏目:百科 来源:网络整理
导读://// main.swift// Swift之闭包总结//// Created by Goddog on 15/7/15.// Copyright (c) 2015年 Goddog. All rights reserved.//import Foundationprintln("闭包是功能性自包含模块,可以在代码中被传递和使用。 Swift 中的闭包与 C 和 Objective-C中的 blo
// // main.swift // Swift之闭包总结 // // Created by Goddog on 15/7/15. // Copyright (c) 2015年 Goddog. All rights reserved. // import Foundation println("闭包是功能性自包含模块,可以在代码中被传递和使用。 Swift 中的闭包与 C 和 Objective-C中的 blocks 以及其他一些编程语言中的 lambdas 比较相似。闭包可以捕获和存储其所在上下文中任意常量和变量的引用。 这就是所谓的闭合并包裹着这些常量和变量,俗称闭包。Swift会为您管理在捕获过程中涉及到的内存操作。闭包采取如下三种形式之一:1. 全局函数是一个有名字但不会捕获任何值的闭包;2. 嵌套函数是一个有名字并可以捕获其封闭函数域内值的闭包;3. 闭包表达式是一个利用轻量级语法所写的可以捕获其上下文中变量或常量值的没有名字的闭包") //MARK: - 使用闭包表达式代替嵌套函数 //定义函数,该函数返回值类型为(Int) -> Int func getFunc(#type:String) ->(Int) ->Int { //该函数返回的是闭包 switch(type) { case "square": return { (val:Int) ->Int in return val * val } default: return { (val:Int) ->Int in return val * val * val } } } var mathFuc = getFunc(type: "square") println(mathFuc(2)) mathFuc = getFunc(type: "others") println(mathFuc(2)) //MARK: - 闭包表达式格式 /** { (形参列表) -> 返回值类型 in //零条或多条可执行语句 } */ //MARK: - 调用闭包 //定义闭包 var square = {(value val:Int) -> Int in return val * val } //调用闭包 println("直接调用闭包:(square(3))") //使用闭包表达式定义闭包,并在闭包表达式后面增加圆括号来调用该闭包 var result = {(#base:Int,#exponent:Int) -> Int in var result = 1 for i in 1...exponent { result *= base } return result }(2,3) //注意了 println("圆括号调用闭包:(result)") //MARK: - 利用上下文推断类型 var squares:(Int) -> Int = {val in return val * val} var results:(Int) = {base,exp in return base + exp }(1,2) println(squares(2)) println(results) //MARK: - 省略return var square1 : (Int) ->Int = {val in val * val} println("省略return:(square1(3))") //MARK: - var square2 : (Int) ->Int = {$0 * $0} println("省略形参名:(square2(2))") var result2 : Int = { var result = 1 for i in 1...$1 { result *= $0 } return result }(2,2) println(result2) //MARK: - 尾随闭包 /** 尾随闭包则是一个提高可读性的写法-如果调用函数的最后一个参数是闭包,Swift将调用函数的反圆括号提前到闭包表达式的正花括号({)之前 */ //定义函数类型的形参,其中fn是(Int) -> Int类型的形参 func map(var #data : [Int],#fn : (Int) -> Int)->[Int] { for var i=0; i<data.count; i++ { data[i] = fn(data[i]) } return data } var data = [2,3,4,5,6] //尾随闭包,省略了形参类型、形参名、返回值类型、return关键字 var rvt2 = map(data: data){$0 * $0} println(rvt2) var rvt3 = map(data: data){$0 * $0 * $0} println(rvt3) //MARK: - 捕获上下文中的变量和常量 //闭包可以访问或修改上下文中的变量或常量(常量只能访问不能修改) //Swift最简单的闭包形式就是嵌套函数,嵌套函数可以捕获它所在的封闭函数的变量、常量及其参数 //定义一个函数,该函数返回值类型为() -> [String] func makeArray(ele : String) -> () ->[String] { //创建一个不包含任何元素的数组 var arr:[String] = [] func addElement() ->[String] { arr.append(ele) return arr } return addElement } let add1 = makeArray("曹操") println(add1()) println(add1()) let add2 = makeArray("刘备") println(add2()) println(add2()) //MARK: - 闭包是引用类型 /** 当程序把一个函数或闭包赋值给一个变量或者常量时,程序并没有正真使用该变量或常量来存储这个函数或闭包,程序只是让该引用变量引用被赋值的函数或闭包而已 这意味这当程序把一个闭包赋值给两个引用变量时,程序并不会复制他们,而是让两个引用变量指向同一个闭包 */ let add3 = add2 println(add3()) println(add3()) 闭包是功能性自包含模块,可以在代码中被传递和使用。 Swift 中的闭包与 C 和 Objective-C中的 blocks 以及其他一些编程语言中的 lambdas 比较相似。闭包可以捕获和存储其所在上下文中任意常量和变量的引用。 这就是所谓的闭合并包裹着这些常量和变量,俗称闭包。Swift会为您管理在捕获过程中涉及到的内存操作。闭包采取如下三种形式之一:1. 全局函数是一个有名字但不会捕获任何值的闭包;2. 嵌套函数是一个有名字并可以捕获其封闭函数域内值的闭包;3. 闭包表达式是一个利用轻量级语法所写的可以捕获其上下文中变量或常量值的没有名字的闭包 4 8 直接调用闭包:9 圆括号调用闭包:8 4 3 省略return:9 省略形参名:4 4 [4,9,16,25,36] [8,27,64,125,216] [曹操] [曹操,曹操] [刘备] [刘备,刘备] [刘备,刘备,刘备] Program ended with exit code: 0 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- c – 如何在64位(而不是任何80位寄存器)中强制所有双精度
- sqlite db 数据恢复
- COCOS2D-X]裁剪实现
- ruby-on-rails – Rails 4.2.0.beta2中的奇怪行为 – 这是一
- FlashDevelop可以部署到iOS吗?
- cocos creator基础-(三十二)cc.Graphics组件和cc.Camera组件
- HDU 1561 ——The more, The Better(有依赖的树形DP)
- Fragment 创建不了, XML 文件报错
- Cocos2d-x 3.2编写常用UI组件(二)滚动计数器NumberScroll
- 使用FastJson在JSON字符串、JSON对象及JavaBean之间的相互转