swift 闭包

2016-12-29  本文已影响11人  Chefil

闭包是自包含的函数代码块,可以在代码中被传递和使用。Swift 中的闭包与 C 和 Objective-C 中的代码块(blocks)以及其他一些编程语言中的匿名函数比较相似。

闭包可以捕获和存储其所在上下文中任意常量和变量的引用。被称为包裹常量和变量。 Swift 会为你管理在捕获过程中涉及到的所有内存操作。
闭包采取如下三种形式之一:

Swift 的闭包表达式拥有简洁的风格,并鼓励在常见场景中进行语法优化,主要优化如下:

闭包表达式语法

{ (parameters) -> returnType in
statements
}

代码例子

        let userNames = ["chefil", "lily", "hanmeimei", "jack", "tom"]
        func backWords(s1: String, s2: String) -> Bool {
            return s1 > s2
        }
        let resultName1 = userNames.sorted(by: backWords)//普通函数作为参数
        print("resultName1 = \(resultName1)")
        let resultName2 = userNames.sorted(by: {//闭包标准写法
            (s1: String, s2: String) -> Bool in
            return s1 > s2
        })
        print("resultName2 = \(resultName2)")
        let resultName3 = userNames.sorted(by: {//根据上下文推断类型
            s1, s2 in
            return s1 > s2
        })
        print("resultName3 = \(resultName3)")
        let resultName4 = userNames.sorted(by: {//单表达式闭包隐式返回
            s1, s2 in s1 > s2
        })
        print("resultName4 = \(resultName4)")
        let resultName5 = userNames.sorted(by: {//参数名称缩写
            $0 > $1
        })
        print("resultName5 = \(resultName5)")
        let resultName6 = userNames.sorted(by: (>))//运算符函数
        print("resultName6 = \(resultName6)")

尾随闭包

如果你需要将一个很长的闭包表达式作为最后一个参数传递给函数,可以使用尾随闭包来增强函数的可读性。尾随闭包是一个书写在函数括号之后的闭包表达式,函数支持将其作为最后一个参数调用。在使用尾随闭包时,你不用写出它的参数标签
someFunctionThatTakesAClosure() {
// 闭包主体部分
}

  1. 尾随闭包写法
        let resultName7 = userNames.sorted() {
            $0 > $1
        }
  1. 如果闭包表达式是函数或方法的唯一参数,则当你使用尾随闭包时,你甚至可以把 () 省略掉
        let resultName8 = userNames.sorted {
            $0 > $1
        }
  1. 函数只有一个闭包参数,同时将闭包参数实现为尾随闭包
        let strings = numbers.map {
            (var name) -> String in
            var output = ""
            while number > 0 {
                output = digitNames[number % 10]! + output
                number /= 10
            }
            
            return number
        }
上一篇下一篇

猜你喜欢

热点阅读