理解版本0.0.3

理解 0.0.3

Daniel Duan维护。



理解 0.0.3

  • Daniel Duan

理解

这个库提供了对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包管理器

.package(url: "[email protected]:dduan/Comprehension.git", .branch("master")),

(并且将"理解"添加到目标依赖中)

CocoaPods

use_frameworks!

pod "Comprehension"

Carthage

github "dduan/Comprehension"

直接嵌入

Sources/理解/理解.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)。当输入是两个列表时

// 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