Swift Algorithms 发布公告

我很高兴地宣布 Swift Algorithms,这是一个新的开源软件包,包含序列和集合算法以及它们相关的类型。

算法是强大的思维工具,因为它们封装了难以阅读且容易出错的原始循环。Algorithms 包包含许多在其他流行的编程语言中常见的强大通用算法。我们希望这个新软件包能够帮助人们拥抱算法,从而提高代码的正确性和性能。

简要概览

通过 Algorithms 包的初始序列和集合操作集,您可以遍历集合的元素,查找组合和排列,创建随机样本等等。

其中包含一对 chunked 方法,每种方法都将集合分解为连续的子序列。其中一个版本测试相邻元素以查找块之间的断点 — 您可以使用它来快速将数组分成升序运行的序列

let numbers = [10, 20, 30, 10, 40, 40, 10, 20]
let chunks = numbers.chunked(by: { $0 <= $1 })
// [[10, 20, 30], [10, 40, 40], [10, 20]]

另一个版本查找每个后续值的转换中的变化。您可以使用它来按首字母将名称列表分成组

let names = ["Cassie", "Chloe", "Jasmine", "Jordan", "Taylor"]
let chunks = names.chunked(on: \.first)
// [["Cassie", "Chloe"], ["Jasmine", "Jordan"], ["Taylor"]]

您可以在包含的指南中阅读有关 chunkedAlgorithms 包中任何其他组件的更多信息

与 Swift 标准库的关系

我们的目标是让标准库包含一组丰富且实用的通用算法。我们认为 Algorithms 包可以通过作为一个低摩擦的场所来构建新的相关算法系列来帮助实现这一目标——这让我们有机会迭代地探索问题空间,并了解不同算法如何连接和交互——然后再将它们升级到标准库。

像 Swift Algorithms (和 Swift Numerics) 这样的软件包通过提供以下方式来补充 Swift Evolution 流程:

Algorithms 包在某种程度上是对漫长的 SE-0270 审查和后续 Evolution 流程讨论的回应。在 SE-0270 中,我们面临着一个矛盾,即提案要足够小,以便有效地利用 Swift 讨论论坛,但又要足够大,以激励和确保添加内容的一致性。展望未来,我们计划尝试将相关算法系列分解为多个较小的 Evolution 提案,并利用 Algorithms 包的存在来提供额外的背景信息。

但是,仅仅因为一个新增功能可能是包含在 Algorithms 包中的一个好的候选,并不意味着它必须从那里开始它的生命周期。这 不是Swift Evolution 流程的更改。一如既往,我们将继续考虑获得良好支持的提案。

贡献标准

该软件包当前的重点是孵化一组实用的算法,这些算法在 SequenceCollection 协议族上进行了泛化,最终包含在 Swift 标准库中——您可能会在 Python itertools 模块或 C++ algorithms 库中找到的那种功能。

有许多有趣且有用的抽象不符合此标准。例如

对于添加到 Algorithms 包的任何内容,都应努力收集用例并检查该主题在其他语言和其他平台上是如何探索的。为了评估其适用性,我们应该问

… 或者反过来说

参与进来!

我们非常欢迎您的经验、反馈和贡献!

有问题吗?

请随时在 Swift 论坛上的相关主题帖中提出关于这篇文章的问题。