Menu
CoddyTech

自定义高阶函数

本课属于 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
}

一旦你能传递闭包,标准库看起来就不再像魔法,而更像一组你自己也能编写的模式。

challenge icon

挑战

中等

编写一个独立函数 partition(_ items: [Int], by predicate: (Int) -> Bool) -> ([Int], [Int]),只遍历一次数组,并返回一个元组 (matched, rest):满足谓词的元素,以及其余元素,两部分都保持原有顺序。

读取两行:第一行是一个整数 min,第二行是一个以逗号分隔的整数列表。使用你的 partition,并传入一个检查 n > min 的谓词。输出:

  1. matched: <...>
  2. 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]);打印匹配项和其余项
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

逻辑与流程中的所有课

自己练习: Swift 在线编辑器