闭包基础
本课属于 Coddy Swift 学习旅程的“逻辑与流程”单元。第 38 课,共 56 课。
闭包是一个独立的代码块,你可以将它传递给其他地方,并在之后调用。完整语法会写出参数和返回类型:
let double = { (n: Int) -> Int in
return n * 2
}
print(double(5)) // 10上下文明确时,Swift 可以推断类型,所以你很少需要写完整形式。在 map、filter 等地方,通常使用更简短的简写形式:
let nums = [1, 2, 3, 4]
let doubled = nums.map { n in n * 2 }
let alsoDoubled = nums.map { $0 * 2 } // 最简写法,$0 是第一个参数闭包是值,你可以把它们存储在变量中,从函数中返回它们,并将它们作为参数传递。这就是 map 能够运行的原因。
挑战
简单读取两行输入:
- 一个整数
x - 一个以逗号分隔的整数列表
定义三个闭包,每个闭包的类型都是 (Int) -> Int:
addX将x加到它的参数上square返回参数的平方negate返回参数的相反数
使用 map 将每个闭包应用于列表中的每个元素。打印三行,每个闭包一行,结果以 , 连接:
addX: ...
square: ...
negate: ...如果第 1 行的输入是 10,第 2 行的输入是 1,2,3,输出为:
addX: 11,12,13
square: 1,4,9
negate: -1,-2,-3亲手试试
let x = Int(readLine()!)!
let nums = readLine()!.components(separatedBy: ",").map { Int($0)! }
// TODO:定义三个 (Int) -> Int 闭包,并分别用它们对 nums 进行映射
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: Swift 在线编辑器