Swift 闭包Closures

什么是Closures?
Closures是自包含的代码块,在代码中使用或是作为参数传值,和OC中的blocks类似.
Swift中闭包的优势
1.根据上下文推断参数和返回值类型
2.隐式返回(可以省略return)
3.简化参数(如$0,$1;从0开始表示第n个参数)
4.Trailing闭包表达式

闭包表达式形式


具体实例:

// 使用函数
let names = ["Chris","Alex","Ewa","Barry","Daniella"]
func backwards(s1: String,_ s2: String) -> Bool {
    return s1 > s2
}
var reversed = names.sort(backwards)
// reversed = ["Ewa","Daniella","Chris","Alex"]
// 使用闭包
reversed = names.sort({ (s1: String,s2: String) -> Bool in
    return s1 > s2
})
// reversed = ["Ewa","Alex"]
reversed = names.sort( { s1,s2 in return s1 > s2 } )
// reversed = ["Ewa","Alex"]
reversed = names.sort( { $0 > $1 } ) // 简写参数 隐式返回
// reversed = ["Ewa","Alex"]
reversed = names.sort { $0 > $1 }    // 进一步简写
// reversed = ["Ewa","Alex"]
reversed = names.sort() { $0 > $1 }  // Trailing闭包
// reversed = ["Ewa","Alex"]
reversed = names.sort(>)             // Operator Functions Swift中定义了一个>作为函数,并返回一个bool类型的数据
// reversed = ["Ewa","Alex"]

let digitNames = [
    0: "Zero",1: "One",2: "Two",3: "Three",4: "Four",5: "Five",6: "Six",7: "Seven",8: "Eight",9: "Nine"
]
let numbers = [16,58,510]
//  map(_:) 遍历numbers
let strings = numbers.map {
    (number) -> String in
    var number = number
    var output = ""
    while number > 0 {
        output = digitNames[number % 10]! + output  // 先取出个位
        number /= 10                                // 取出十位
    }
    print("output = \(output)")  // 依次打印:Onesix,FiveEight,FiveOneZero
    return output
}
// 值捕获
func makeIncrementer(forIncrement amount: Int) -> () -> Int {
    var runningTotal = 0
    func incrementer() -> Int {
        runningTotal += amount
        return runningTotal
    }
    return incrementer
}
// 引用闭包
let incrementByTen = makeIncrementer(forIncrement: 10)
print("incrementByTen = \(incrementByTen())") // incrementByTen = 10
print("incrementByTen = \(incrementByTen())") // incrementByTen = 20
print("incrementByTen = \(incrementByTen())") // incrementByTen = 30

// Nonescaping 闭包
func someFunctionWithNonescapingClosure(@noescape closure: () -> Void) {
    closure()
}
var completionHandlers: [() -> Void] = []
func someFunctionWithEscapingClosure(completionHandler: () -> Void) {
    completionHandlers.append(completionHandler)
}
class SomeClass {
    var x = 10
    func doSomething() {
        someFunctionWithEscapingClosure { self.x = 100 }
        someFunctionWithNonescapingClosure { x = 200 }
    }
}

let instance = SomeClass()
instance.doSomething()
print(instance.x)
// Prints "200"

completionHandlers.first?()
print(instance.x)
// Prints "100"

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...