Есть ли лучший способ создать много разных URL? - PullRequest
0 голосов
/ 17 декабря 2018

Я работаю над созданием фреймворка для подключения к определенному API, и мне нужно будет создать много разных путей.Моя текущая настройка использует Enum для возврата URL, который по большей части работает довольно хорошо.Моя единственная проблема, с которой я сталкиваюсь при таком подходе, - ко времени, когда я закончу, будет лот различных дел (всего ~ 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 голосов
/ 17 декабря 2018

Я бы перевернул это так же, как 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"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...