理解
这个库提供了对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。