闭包

作者: 架构师的一小步 | 来源:发表于2018-12-10 17:44 被阅读0次
闭包:自包含的代码块,可以在代码中被传递和使用

(s1:String, s2:String) -> Bool in return s1<s2 } //闭包

闭包的三种形式

闭包表达式语法

闭包简化写法

let names=["Zhao","Sun","Qian","D"]


func comparator(s1:String,s2:String) ->Bool{
    return s1<s2
}

//对字符串按照大小进行排序
var sortedNames=names.sorted{$0<$1}

print(sortedNames)

var newNames=names.sorted(by: comparator)
newNames=names.sorted(by: { (s1:String,s2:String) ->Bool in return s1<s2 })

newNames=names.sorted(by: {s1,s2 in return s1<s2})

newNames=names.sorted(by: {s1,s2 in s1<s2})

newNames=names.sorted(by: {$0<$1})

newNames=names.sorted(){$0<$1}

newNames=names.sorted {$0<$1}

newNames=names.sorted  (by: <)

简略写法2

/**
 * 函数简略写法
 */

func calculate(a:Int,b:Int,mathFunction:(Int,Int)->Int)->Int{
    return mathFunction(a,b)
}

func addTwoInts(a:Int,b:Int)->Int{
    return a+b
}

var door=calculate(a: 3, b: 5, mathFunction: {(a:Int,b:Int)->Int in return a+b})//一行代码 将addTwoInts闭包放到这个函数内

 door=calculate(a: 3, b: 5, mathFunction: {a,b in return a+b})//根据上下文推断类型

 door=calculate(a: 3, b: 5, mathFunction: {a,b in a+b}) //但表达式闭包隐式返回

 door=calculate(a: 3, b: 5, mathFunction: {$0+$1})//参数名称缩写

 door=calculate(a: 3, b: 5) {$0+$1}  //尾随闭包方式

//添加新的方法
door=calculate(a: 3, b: 5) {$0*$1}//乘法

door=calculate(a: 3, b: 5) {$0*$0*$1} //第一个参数乘两次再乘第二个参数

高阶函数

  • 接收一个或多个函数作参数
  • 或者把一个函数当做返回值
  • map
  • reduce
  • filter

map

/**
 * 高阶函数
 */

//1.map 用来对数组元素进行某种规则的转换
let numbers = [1,2,3,4]
//需求:1.将numbers数组里的值全变成第..个   2.将数组值变成11,12,13,14
//解决方案:map
//1.完整写法
let numbersName=numbers.map { (element:Int) -> String in
    return "第"+String(element)+"个"
}
print(numbersName)//["第1个", "第2个", "第3个", "第4个"]
//1.简略写法
let numbersName1=numbers.map{"第"+String($0)+"个"}//尾随闭包+参数名缩写
print(numbersName1)//["第1个", "第2个", "第3个", "第4个"]

//2.完整写法
let newNubers = numbers.map { (element:Int) -> Int in
    return element+10
}
print(newNubers)//[11, 12, 13, 14]
//2.简略写法
let newNumbers=numbers.map{$0+10}
print(newNumbers)//[11, 12, 13, 14]

reduce:对数组元素进行某种规则的归纳

/**
 * 高阶函数
 */

//reduce

//1.累加 2.累乘
let numbers=[1,2,3,4]
//1.完整写法需要设置初始值这里加法所以设置0 期望结果:1+2+3+4=10  这里设置成0实际结果是0+1+2+3+4=10
var reduceResult=numbers.reduce(0){(prevSum:Int, element:Int) in prevSum+element}
//$0指之前的归纳值 1.简略写法
reduceResult=numbers.reduce(0){$0+$1}//10

print(reduceResult)

//2.完整写法,这里设置成1,实际运算是1*1*2*3*4=24
reduceResult=numbers.reduce(1){(prevSum:Int, element:Int) in prevSum*element}

//2.简略写法
reduceResult=numbers.reduce(1){$0*$1}
print(reduceResult)//24

filter:对数组元素进行某种规则的过滤

/**
 * 高阶函数
 */

//需求:过滤出其中的偶数
let numbers=[1,2,3,4,44,55,66,789,1123,2018]
//符合偶数的数提取出来存入evens
var evens=numbers.filter{(element:Int) in return (element%2==0)}

evens=numbers.filter{element in element%2==0}

evens=numbers.filter{$0%2==0}

print(evens)//[2, 4, 44, 66, 2018]

//符合偶数的数提取出来存入evens
evens=numbers.filter{(element:Int) in return (element%2==1)}

evens=numbers.filter{$0%2==1}

print(evens)//[1, 3, 55, 789, 1123]

捕获值(capturing values)

嵌套函数可以随时获取amount,runingTotal和incrementor函数的值
//嵌套函数
func makeIncrementor(forIncrement amount:Int)->() ->Int{
    var runningTotal = 0
    func incrementor() ->Int {
        runningTotal += amount
        return runningTotal
    }
    return incrementor
}

let incrementByTen=makeIncrementor(forIncrement: 10)
print(incrementByTen())//10
//将这个incrementByTen这个函数赋值给anotherIncrementByTen,调用anotherIncrementByTen会在incrementByTen的值为10的基础上进行继续计算
let anotherIncrementByTen=incrementByTen
print(anotherIncrementByTen())//20
//如果直接调用makeIncrementor这个函数值会重新开始计算
let therdIncrementByTen=makeIncrementor(forIncrement: 10)
print(therdIncrementByTen())//10

这里incrementByTen调用完闭包之后,another...ByTen调用这个闭包,因为这个闭包是引用类型,多以他们指向了同一个地址, 闭包维护了内部的函数和自由变量,第二个函数调用会在原来的基础上进行累计

逃逸闭包

闭包使用场景

需要加@escaping关键字的闭包逃逸场景

相关文章

  • swift-闭包

    闭包 闭包定义 闭包简化 - 尾随闭包 闭包参数 闭包返回值 闭包的循环引用

  • 闭包,闭包,闭包

    1、这家伙到底是什么? 网上关于这个的讨论的太多了太多了,有各种的举例子,但是大部分还在寻找这个答案的小伙伴对于变...

  • 闭包-Closures [swift 5.1]

    闭包的语法 尾随闭包 闭包逃离 自动闭包

  • Day7 闭包(Closures)

    本页包含内容:• 闭包表达式• 尾随闭包• 值捕获• 闭包是引用类型• 逃逸闭包• 自动闭包 1、闭包表达式 闭包...

  • Python闭包

    闭包 = 环境变量 + 函数 调用闭包内部的环境变量 闭包的经典误区 闭包与非闭包实现人类走路 非闭包 闭包

  • 闭包(closure)

    ● 闭包基础 ● 闭包作用 ● 闭包经典例子 ● 闭包应用 ● 闭包缺点 ● 参考资料 1、闭包基础 作用域和作...

  • swift- 闭包一

    /*• 闭包表达式• 尾随闭包• 值捕获• 闭包是引用类型• 逃逸闭包• 自动闭包*/

  • (9) python之闭包

    闭包闭包 = 函数 + 环境变量(函数定义的时候) 一个最简单的闭包 闭包不受外部变量影响 非闭包 闭包 闭包 只...

  • Swift-进阶 :闭包(二)逃逸闭包 & 非逃逸闭包

    本文主要分析逃逸闭包 、非逃逸闭包、自动闭包 逃逸闭包 & 非逃逸闭包 逃逸闭包定义 当闭包作为一个实际参数传递给...

  • javascript闭包详解

    跟我念 bi 闭 bao包 ,闭包的闭,闭包的包。。 闭包的简介 在计算机科学中,闭包(英语:Closure),又...

网友评论

      本文标题:闭包

      本文链接:https://www.haomeiwen.com/subject/lenrhqtx.html