# NoopKit

No-operation Kit 的缩写。一组使处理空闭包变得轻而易举的函数。

我们所说的空闭包是指

动机

日复一日,我们在应用程序中越来越多地使用函数式编程。对于 Apple 平台上的主流开发者来说,SwiftUI 的引入是一个转折点。

在 UIKit 中,编写一个空方法或在界面构建器中不连接 IBAction 就足够了。但是正如您所见,这有一个缺点,很难搜索空方法或未使用的控件。

同样,很难搜索传递给高阶函数的未实现的闭包。它们可能是一团下划线、括号和圆括号。我希望通过传递命名函数来改善积极开发期间的体验,这使我们能够编写更易于人类阅读且更易于发现的代码。

在以下典型用例中,这些自由函数会大放异彩

其次,我想学习 Sourcery 并了解如何在 Swift 中使用可变泛型,直到 Generics manifesto 中提出的解决方案 添加到语言中。

截至 Swift 5.9,实现已更改为参数包。生成的代码仍然保留以保持与旧版本 Swift 的向后兼容性。

使用示例

这个库提供了四个带有可变泛型的自由纯函数。

No-op

可以用作调用不需要任何操作的高阶函数时的临时占位符。有时参数不是可选的,您需要传递一个值。

// With anonymous closure
URLSession.shared.dataTask(with: url) { _, _, _ in }.resume()
// Named function
URLSession.shared.dataTask(with: url, completionHandler: noop).resume()

noop 函数的另一个典型位置是在高阶函数中作为默认参数。

// With anonymous closure
func animate(with completion: (Bool) -> Void = { _ in })
// Named function
func animate(with completion: (Bool) -> Void = noop)

Undefined

noop 类似,undefined 是一个占位符函数,但它不是什么都不做,而是调用致命错误。此函数向开发人员明确表示,它需要实现。它很容易找到,这与空闭包的情况不同。

Button("Tap and crash", action: undefined)
Stepper("Step to crash", onIncrement: undefined, onDecrement: undefined)

Constant

Undefinednoop 不适用于返回值。Const 函数接受一个参数并返回一个闭包,该闭包丢弃所有参数并不断返回提供的值。

// Using closure
validate(string: "Some string", using: { _ in true })
// Using const function
validate(string: "Some string", using: const(true))

Identity

Identity (id) 函数以元组形式返回它接收的所有参数。这在只有一个参数的函数中很有用。典型的用例是 compactMap 方法。

// Using closures
[1, nil, 2, nil].compactMap { $0 }
// Using id function
[1, nil, 2, nil].compactMap(id)

如您所见,id 可以替换任何返回一个匿名参数的 { $0 } 闭包。

安装

将此包依赖项添加到您的 Xcode 项目,或将以下行添加到您的 Package.swift 文件

.package(url: "https://github.com/mkj-is/NoopKit.git", from: "1.0.0")

如果您想进行实验并且不需要完整包,请随时使用复制和粘贴来添加其中一些自由函数。

披露

这些函数中的大多数只是语法糖。在将它们添加到您的项目时请注意。Swift 本身就是一种复杂的语言,并且向您的项目引入更多语法糖可能会增加代码的复杂性和可理解性。我个人不在团队项目中使用这些函数,而是在我的个人项目中进行实验性使用。如果将这些函数引入您的代码库,请确保每个贡献者都理解它们并接受它们的使用。

作者和贡献者

欢迎所有贡献。

项目由 Matěj Kašpar Jirásek 创建。

项目根据 MIT 许可证 获得许可。

致谢

过去有些人探索过类似的概念,特别是

许多想法来自 Haskell 和其他函数式编程语言。

我主要通过使用代码生成添加“可变泛型”来迭代他们的工作。