我正在构建一个框架以连接到特定的API,并且将需要构建许多不同的路径。我当前的设置是使用Enum返回URL,在大多数情况下效果很好。我用这种方法遇到的唯一问题是,到我完成时,会有很多不同情况的 lot (总共约30个)。我想知道是否有人有更好的解决方案?
enum API {
var baseURL: URL {
return URL(string: "https://api.example.com")!
}
case user
case emails
case posts
case post(id: String)
// etc . . .
}
extension API: Path {
func appendPathComponent(_ string: String) -> URL {
return baseURL.appendingPathComponent(string)
}
var url: URL {
switch self {
case .user: return baseURL
case .emails: return appendPathComponent("email")
case .posts: return appendPathComponent("posts")
case .post(let id): return appendPathComponent(id)
// etc
}
}
}
// call site
let url = API.emails.url
答案 0 :(得分:0)
我将以与Notification.Name
相同的方式来解决这个问题。在URL上进行以下扩展:
extension URL {
static let apiBase = URL(string: "https://api.example.com")!
static let apiUser = apiBase
static let apiEmails = apiBase.appendingPathComponent("email")
static let apiPosts = apiBase.appendingPathComponent("posts")
static func apiPost(id: String) -> URL { return apiBase.appendingPathComponent(id) }
}
然后称它为:
let x = URL.apiEmails
在已知URL
的情况下,您甚至不必包括以下内容:
let task = URLSession.shared.dataTask(with: .apiEmails)
或
let task = URLSession.shared.dataTask(with: .apiPost(id: "123"))