自定义高阶函数
本课属于 Coddy Swift 学习旅程的“逻辑与流程”单元。第 42 课,共 56 课。
现在,你可以编写自己的高阶函数,让它们和 map、filter 配合使用。结构始终相同:接收一个闭包参数,在循环中调用它,然后返回结果。
extension Array {
func myMap<T>(_ transform: (Element) -> T) -> [T] {
var result: [T] = []
for item in self {
result.append(transform(item))
}
return result
}
}
[1, 2, 3].myMap { $0 * 10 } // [10, 20, 30]如果你觉得扩展有点复杂,可以改写一个自由函数,思路是一样的:
func count<T>(_ items: [T], where predicate: (T) -> Bool) -> Int {
var n = 0
for item in items where predicate(item) {
n += 1
}
return n
}一旦你能传递闭包,标准库看起来就不再像魔法,而更像一组你自己也能编写的模式。
挑战
中等编写一个独立函数 partition(_ items: [Int], by predicate: (Int) -> Bool) -> ([Int], [Int]),只遍历一次数组,并返回一个元组 (matched, rest):满足谓词的元素,以及其余元素,两部分都保持原有顺序。
读取两行:第一行是一个整数 min,第二行是一个以逗号分隔的整数列表。使用你的 partition,并传入一个检查 n > min 的谓词。输出:
matched: <...>rest: <...>
每个列表都用 , 连接(如果没有要输出的内容,则为空)。
输入 5 / 2,7,3,8,5 时,输出为:
matched: 7,8
rest: 2,3,5亲手试试
let min = Int(readLine()!)!
let nums = readLine()!.components(separatedBy: ",").map { Int($0)! }
// TODO:使用 partition(_:by:) -> ([Int], [Int]);打印匹配项和其余项
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: Swift 在线编辑器