【Swift初见】Swift闭包

闭包是功能性自包含模块,可以在代码中被传递和使用。与objective-c中的block比较类似。

闭包有三种形式:

1、全局函数

2、嵌套函数

3、闭包表达式是一个利用轻量级语法所写的可以捕获其上下文中变量或常量值的没有名字的闭包

闭包表达式是一种利用简洁语法构建内联闭包的方式。 闭包表达式提供了一些语法优化, 使得撰写闭包变得简单明了。

闭包的一般形式:

{ (parameters) -> return type in
statements
}

以swift提供的sort函数为例:

对一个数组进行排序:

普通函数的做法是:

let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]

func backwards(s1 : String , s2 : String) -> Bool {
    return s1 > s2
}
var reserve = sorted(names, backwards)
println(reserve)

得到的输出为:

[Ewa, Daniella, Chris, Barry, Alex]

使用闭包表达式的代码为:

var reserved = sorted(names, {(s1 : String , s2 : String) -> Bool in
    return s1 > s2
})
println(reserved)

得到的输出为:

[Ewa, Daniella, Chris, Barry, Alex]

相当于把backwards函数作为一个参数传给了sorted函数,函数和返回值类型都应该写在大括号内。闭包的函数体部分由in关键字引入,in后面就是代表该闭包的函数体部分。

swift函数有类型推断的功能,排序闭包又是作为函数的参数传入的,那么swift可以推断出它的参数和返回值类型,那么sorted函数可以改写为:

var reserved1 = sorted(names, {s1 , s2 in return s1 > s2})
println(reserved1)

我们可以看出得出的结果还是一样的。

单行表达式闭包可以通过隐藏return关键字来隐式返回表达式的结果。那么上面的代码可以改写为:

var reserved2 = sorted(names, {(s1 : String , s2 : String) -> Bool in  s1 > s2 })
println(reserved2)

参数名简写:

swift自动为内联函数提供了参数名简写功能,可以直接通过$0 $1 $2等名字来引用的闭包的参数的值。

用字符串排序的时候,系统对”>”符号总报有歧义这个错误,用int数据来排序就没问题了。

let intNumbers = [2, 3, 4, 5]
var reserved3 = sorted(intNumbers, { $0 > $1 })
println(reserved3)

得到的结果是:

[5, 4, 3, 2]

希望大家共同学习。

时间: 2024-12-24 13:34:48

【Swift初见】Swift闭包的相关文章

Swift 初见

Swift 初见 本页内容包括: 简单值(Simple Values) 控制流(Control Flow) 函数和闭包(Functions and Closures) 对象和类(Objects and Classes) 枚举和结构体(Enumerations and Structures) 协议和扩展(Protocols and Extensions) 泛型(Generics) 通常来说,编程语言教程中的第一个程序应该在屏幕上打印“Hello, world”.在 Swift 中,可以用一行代码实

The Swift Programming Language 中文版---Swift 初见

Swift 初见 本页内容包括: 简单值(Simple Values) 控制流(Control Flow) 函数和闭包(Functions and Closures) 对象和类(Objects and Classes) 枚举和结构体(Enumerations and Structures) 接口和扩展(Protocols and Extensions) 泛型(Generics) 通常来说,编程语言教程中的第一个程序应该在屏幕上打印"Hello, world".在 Swift 中,可以用

Swift函数和闭包

函数 Swift 使用func关键字声明函数: 1 func greet (name: String, day: String) -> String { 2 return "Hello \(name), today is \(day)." 3 } 4 greet ("Bob", "Tuesday") 通过元组(Tuple)返回多个值: 1 func getGasPrices () -> (Double, Double, Double)

Swift中的闭包(Closure) 浅析

转载自:http://www.devtalking.com/articles/closure-expressions-in-swift/ 闭包在Swift中非常有用.通俗的解释就是一个Int类型里存储着一个整数,一个String类型包含着一串字符,同样,闭包是一个包含着函数的类型.有了闭包,你就可以处理很多在一些古老的语言中不能处理的事情.这是因为闭包使用的多样性,比如你可以将闭包赋值给一个变量,你也可以将闭包作为一个函数的参数,你甚至可以将闭包作为一个函数的返回值.它的强大之处可见一斑. 在S

Swift学习:闭包(Closures)

/* 闭包(Closures)* 闭包是自包含的功能代码块,可以在代码中使用或者用来作为参数传值.* 在Swift中的闭包与C.OC中的blocks和其它编程语言(如Python)中的lambdas类似.* 闭包可以捕获和存储上下文中定义的的任何常量和变量的引用.这就是所谓的变量和变量的自封闭,* 因此命名为”闭包“(“Closures)”).Swift还会处理所有捕获的引用的内存管理.** 全局函数和嵌套函数其实就是特殊的闭包.* 闭包的形式有:* (1)全局函数都是闭包,有名字但不能捕获任何

Swift中的闭包(Closure)[转]

闭包在Swift中非常有用.通俗的解释就是一个Int类型里存储着一个整数,一个String类型包含着一串字符,同样,闭包是一个包含着函数的类型.有了闭包,你就可以处理很多在一些古老的语言中不能处理的事情.这是因为闭包使用的多样性,比如你可以将闭包赋值给一个变量,你也可以将闭包作为一个函数的参数,你甚至可以将闭包作为一个函数的返回值.它的强大之处可见一斑. 在Swift的很多文档教材中都说函数是“一等公民”,起初我还不是很理解“一等公民”是什么意思,但当我理解了闭包以及它的强大功能后,我恍然大悟.

Swift 中的闭包与 C 和 Objective-C中的 blocks 以及其他一些编程语言中的 lambdas 比较相似。

闭包是功能性自包含模块,可以在代码中被传递和使用. Swift 中的闭包与 C 和 Objective-C中的 blocks 以及其他一些编程语言中的 lambdas 比较相似. 闭包可以 捕获 和存储其所在上下文中任意常量和变量的引用. 这就是所谓的闭合并包裹着这些常量和变量,俗称闭包.Swift会为您管理在 捕获 过程中涉及到的内存操作. 注意:如果您不熟悉 捕获 (capturing) 这个概念也不用担心,后面会详细对其进行介绍. 在Swift函数章节中介绍的全局和嵌套函数实际上也是特殊的

Swift 学习- 08 -- 闭包

// 闭包是自包含的函数代码块, 可以在代码中被传递和使用, swift 中的闭包 与 C语言 和 OC 中的代码块 (blocks) 以及其他一些编程语言中的匿名函数比较类似 // 闭包可以捕获和存储其所在上下文中任意常量和变量的引用, 被称为包裹常量和变量, swift 会为你管理在捕获过程中涉及到的所有内存操作 // 在 '函数' 章节中介绍的全局和嵌套函数实际上也是特殊的闭包, 闭包采取如下三种形式之一: // 1: 全局函数是一个有名字但不会捕获任何职的闭包 // 2: 嵌套函数是一个

【swift初见】SourceKitService Terminated

心血来潮想试试最新的Xcode6 beta和swift语言,新建一个工程开始swift编程之旅,没想到一直报SourceKitService Terminated错误,框框一直弹出来,并且所有的Xcode里的字体都变成了灰色 其原因是我新建project的时候用的名字是swift,这是Apple的一个保留词,所有编译器会报错. 解决办法就是project命名的时候尽量避免Apple的保留词. [swift初见]SourceKitService Terminated

Swift 中的闭包与 C 和 Objective-C中的 blocks 以及其它一些编程语言中的 lambdas 比較类似。

闭包是功能性自包括模块,能够在代码中被传递和使用. Swift 中的闭包与 C 和 Objective-C中的 blocks 以及其它一些编程语言中的 lambdas 比較相似. 闭包能够 捕获 和存储其所在上下文中随意常量和变量的引用. 这就是所谓的闭合并包裹着这些常量和变量,俗称闭包.Swift会为您管理在 捕获 过程中涉及到的内存操作. 注意:假设您不熟悉 捕获 (capturing) 这个概念也不用操心.后面会具体对其进行介绍. 在Swift函数章节中介绍的全局和嵌套函数实际上也是特殊的