🔌 即插即用
插件是一个 Swift SPM 项目,它提供了一种灵活且模块化的方法,通过使用插件来增强对象的功能。通过遵循 Plugin
协议,可以创建自定义插件并将其添加到遵循 Pluginable
协议的对象,而无需修改其原始实现。这使开发人员能够以即插即用的方式将自定义行为添加到他们的对象中,从而可以轻松地维护和扩展代码。
要创建插件,请创建一个遵循 Plugin 协议的结构体或类,并实现其要求。
这是一个简单的插件示例,它向 URLRequest
对象添加一个 auth
标头
struct AuthPlugin: Plugin {
var keyPath: WritableKeyPath<PluginURLRequest, URLRequest>
func handle(value: Void, output: inout URLRequest) async throws {
output.allHTTPHeaderFields = ["auth": "token"]
}
}
要将插件与对象一起使用,请使其遵循 Pluginable
协议。 这是一个 PluginURLRequest
类的示例,可以向其添加插件
class PluginURLRequest: Pluginable {
var plugins: [any Plugin] = []
var request: URLRequest
init(url: URL) {
self.request = URLRequest(url: url)
}
}
可以使用 register(plugin: any Plugin)
方法将插件注册到 Pluginable
对象。 注册后,可以在对象上调用 handle(value: Any)
方法,以将注册的插件应用于它。
let urlRequest = PluginURLRequest(url: URL(string: "https://example.com")!)
urlRequest.register(plugin: AuthPlugin(keyPath: \.request))
try await urlRequest.handle()
print(urlRequest.request.allHTTPHeaderFields) // ["auth": "token"]
您还可以访问任何插件的 inputType
和 outputType
属性,并获取插件及其 inputType
和 outputType
属性的列表。
let authPlugin = AuthPlugin(keyPath: \.request)
print(authPlugin.inputType) // Void
print(authPlugin.outputType) // URLRequest
let pluginTypes = urlRequest.pluginTypes
print(pluginTypes) // [(input: Void, output: URLRequest)]
Scribe:Scribe 是一个灵活的 Swift 日志记录库,旨在使日志记录变得简单而高效。 它提供了一个集中的系统来记录应用程序中的消息和事件,并支持多个日志输出和插件,以扩展其功能以满足您的需求。 Scribe 与 swift-log 集成以进行控制台日志记录,使其成为满足您所有日志记录需求的多功能解决方案。
PluginTask:PluginTask 是一个自定义的 Task,允许用户添加插件来修改其行为。 可以将插件添加到 PluginTask 实例,以便在任务的主要操作之前或之后执行其他功能。 这样可以轻松修改任务的行为,而无需修改其原始实现。