我厌倦了重复创建带有自定义头部和主体的请求模型的相同模式,因此我决定创建一个 Swift 宏来帮助我简化这个过程。
此库包含各种 Swift 宏,可以在您的项目中使用,以改进代码生成并减少重复性任务
头部和主体宏:使用 HeaderMacro.swift 和 BodyMacro.swift 为 API 调用生成一致的请求头部和主体结构。
请求模型宏:RequestModelMacro.swift 和 RequestModelMacroInterface.swift 方便创建用于 API 的标准化请求模型。此宏有助于确保您的请求模型格式良好、一致且易于维护。
诊断支持:Diagnostics.swift 帮助提供有关生成代码的健康状况和正确性的有用信息,从而使调试更简单、更有效。
属性数据宏:PropertyData.swift 提供了一种简单的方法来处理请求模型的属性生成,确保一致性并减少重复的定义。
输入
import RequestModelMacro
@RequestModel
struct ComplexRequest {
@Header("Auth")
var token: String
@Header("Content-Type")
var contentType: String
@Body("data")
var payload: String
@Body("metadata")
var info: String
}
生成的代码&
struct ComplexRequest {
var token: String {
get {
headers.token
}
}
var contentType: String {
get {
headers.contentType
}
}
var payload: String {
get {
body.payload
}
}
var info: String {
get {
body.info
}
}
private struct Headers: Codable {
let token: String
let contentType: String
enum CodingKeys: String, CodingKey {
case token = "Auth"
case contentType = "Content-Type"
}
}
private struct Body: Codable {
let payload: String
let info: String
enum CodingKeys: String, CodingKey {
case payload = "data"
case info = "metadata"
}
}
var headersDictionary: [String: String] {
do {
let encoder = JSONEncoder()
let data = try encoder.encode(headers)
let jsonObject = try JSONSerialization.jsonObject(with: data, options: [])
if let dictionary = jsonObject as? [String: String] {
return dictionary
} else {
print("Warning: Failed to cast headers dictionary to [String: String]")
return [:]
}
} catch {
assertionFailure("Warning: Failed to encode headers: \\(error)")
return [:]
}
}
var bodyDictionary: [String: Any] {
do {
let encoder = JSONEncoder()
let data = try encoder.encode(body)
let jsonObject = try JSONSerialization.jsonObject(with: data, options: [])
if let dictionary = jsonObject as? [String: Any] {
return dictionary
} else {
print("Warning: Failed to cast body dictionary to [String: Any]")
return [:]
}
} catch {
assertionFailure("Warning: Failed to encode body: \\(error)")
return [:]
}
}
private var headers: Headers
private var body: Body
init(token: String, contentType: String, payload: String, info: String) {
self.headers = Headers(token: token, contentType: contentType)
self.body = Body(payload: payload, info: info)
}
}
Swift 包管理器
您可以使用 Swift 包管理器将此库添加到您的项目中,方法是在您的 Package.swift
中添加以下依赖项
.package(url: "https://github.com/brunogama/RequestModelMacro.git", from: "0.0.1")
注意: 此库缺乏更多测试。因此,使用风险自负。
我们欢迎贡献来改进此库!请随时提出 issue 或提交 pull request。
此库在 MIT 许可下获得许可。 有关更多详细信息,请参见 LICENSE 文件。
如有任何问题或建议,请随时在 Twitter 上与 @brunogama 联系。