Nano Hash - криптовалюты, майнинг, программирование

Использование функций Enum для создания API сетевой абстракции

Я следую дизайну, с которым я столкнулся, который использует Enum для создания сетевого запроса таким образом, который предоставляет элегантный API. По сути, он использует связанные значения для постепенного создания информации (в форме вычисляемых свойств в Enum), которая отправляется в вызов функции Alamofire.

Проблема, с которой я сталкиваюсь, заключается в том, что каждое вычисляемое свойство в Enum фактически требует значения, отличного от связанных значений случаев.

Итак, если я объявлю конечную точку endpoint1(path: String, param1: String), свойство path будет иметь доступ только к первому значению. К сожалению, учитывая то, как работает Swift Enums, кажется, что я должен выставлять все связанные значения для каждого включенного случая. Это приводит к неиспользуемым переменным и, следовательно, должно быть неверным. Поэтому я подумываю отказаться от этого подхода.

Для справки, это мой код, который использует случай Enum для формирования концептуальной конечной точки сети. Который может быть вызван как Endpoint1(path: users/, format: "JSON").

    public enum Endpoints {

        case Endpoint1(path: Sring, param1Value: String)

        public var method: HttpMethod {
            switch self {

            case .Endpoint1,

                return HttpMethod.GET
            }
        }

        public var path: String {
            switch self {
            case .Endpoint1(let path, let paramValue1):
                return baseURL + path 
            }
        }

        public var parameters: [String : AnyObject] {
            var parameters = ["param1" : "..."]
            switch self {
            case .Endpoint1(let path, let param1Value):
                parameters["param1"] = param1Value
                break
            }
            return parameters
        }

}

Таким образом, проблема заключается в том, что свойству path не требуется связанное значение paramValue1, а свойству parameters не требуется связанное значение path.

Несмотря на то, что это немного сложно, мне действительно нравится этот метод использования функций Enum таким образом. К сожалению, этот аспект их функциональности кажется тупиковым. Есть ли способ, которым я мог бы реорганизовать это, чтобы правильно работать со Swift Enums?

01.01.2017

Ответы:


1

Определение EndPoint должно быть списком параметров, а не значениями. Я обновляю ваш код до Swift 3:

public enum Endpoints {

    case endpoint1(path: String, parameters: [String])

    public var method: HttpMethod {
        switch self {
        case .endpoint1:
            return .get
        }
    }

    public func path(_ baseURL: String) -> String {
        switch self {
        case .endpoint1(let path, _):
            return baseURL + path
        }
    }

    public func parameters(_ values: [Any?]) -> [String: Any] {
        var parameters = [String: Any]()
        switch self {
        case .endpoint1(_, let params):
            for (index, param) in params.enumerated() {
                if let v = values[index] {
                    parameters[param] = v
                }
            }
        }
        return parameters
    }

}

let endpoint = Endpoints.endpoint1(path: "/users", parameters: ["sort"])
let params = endpoint.parameters(["desc"])
let path = endpoint.path("http://10.1.1.1")

Используйте функцию вместо ivar, чтобы получить путь и параметры, чтобы вы могли передать варианты baseURL и параметров. Я надеюсь, что это поможет вам решить, хотите ли вы по-прежнему использовать для этого Enum или нет.

01.01.2017
  • Да, использование списка строк является хорошим улучшением для нескольких параметров HTTP. Хотя это не было проблемой, о которой я специально спрашивал, это будет полезно в будущем. Я думаю, что использование _ для игнорирования параметров, которые вас не интересуют в данном контексте, было основным моментом здесь. 01.01.2017
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..