理解

这个库为 Swift 提供 列表推导式。 如下所示:

let numbers = [1, 2, 3]
let letters = "ab"

// produces ["a1", "a2", "a3", "b1", "b2", "b3"]
Array(letters, numbers) { "\($0)\($1)" }

// produces ["a1", "a3", "b1", "b3"]
Array(letters, numbers, where: { $1 % 2 != 0 }) { "\($0)\($1)" }

安装

Swift 包管理器 (Swift Package Manager)

.package(url: "git@github.com:dduan/Comprehension.git", .branch("master")),

(并将 "Comprehension" 添加到目标的依赖项中。)

CocoaPods

use_frameworks!

pod "Comprehension"

Carthage

github "dduan/Comprehension"

直接嵌入

Sources/Comprehension/Comprehension.swift 文件包含到您的项目中。

什么是列表推导式?

列表推导式是一种强大的语法,用于处理 Haskell、Python 等语言中的列表。 当您需要处理多个列表中每个元素的组合(它们的笛卡尔积)时,它特别有用。

列表推导式的起源通常归因于数学中的集合推导式,例如:

{2·x|x ∈ ℕ, x ≤ 10}

... 意味着“取所有小于 10 的整数(集合 ℕ 的元素),每个乘以 2,并用结果形成一个新集合。”

这是一个列表推导式在 Haskell 中如何工作的例子

ghci> [x+y | x <- [1,2,3], y <- [10,100,1000]]
[11,101,1001,12,102,1002,13,103,1003]

在这里,一个列表中的整数与另一个列表中的整数按顺序配对,产生 3 * 3 = 9 对。 每对的和构成了结果整数列表。

单个列表的推导式等同于 list.filter(f).map(g)。 当输入是 2 个列表时:

// Comprehension syntax
let result = Array(list0, list1, where: f) { g($0, $1) }

... 等同于 ...

var result = [TypeOfElementInList0, TypeOfElementInList1]()
for e0 in list0 {
    for e1 in list1 {
        if f(e0, e1) {
            result.append(g(e0, e1))
        }
    }
}
// The fact that `result` is a var is not equivalent, but 🤷‍♀️.

... 或者用函数式风格 ...

let result = list0
    .map { e0 in
        list1.map { e1 in
            (e0, e1)
        }
    }
    .joined()
    .filter(f)
    .map(g)

请注意,上面的列表推导式版本更加简洁。 想象一下将示例扩展到 3、4、5 个列表!

许可

MIT,请参阅 LICENSE