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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值