有没有更好的方法来构建许多不同的URL?

时间:2018-12-16 23:42:02

标签: swift

我正在构建一个框架以连接到特定的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

1 个答案:

答案 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"))