Swift - лучшая практика, чтобы убежать от охраны / позволить чрезмерное использование и дополнительные - PullRequest
1 голос
/ 03 июля 2019

Я считаю, что мой код абсолютно завален опциональными параметрами и инструкциями guard / let.

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

func save(request: Request, completion: @escaping WebServiceResponse){
        guard let description = request.description,
            let totalAmount = request.totalAmount,
            let reserveAmount = request.reserveAmount,
            let holdingPeriod = request.holdingPeriod,
            let sender = request.sender,
            let receiver = request.receiver
            else {
                return
        }
        apiRequest(endpoint: apiEndpoint.Deal, path: "/save", body:
            [
                "description" : description,
                "total": totalAmount,
                "reserve": reserveAmount,
                "period":holdingPeriod,
                "from":sender,
                "to":receiver
            ], completion: completion)
    }

Я нахожу эти проблемы во всем коде всякий раз, когда использую дополнительные функции, особенно когда использую дополнительные вобъект класса.

Один ответ предложил добавить дополнительную сложность, чтобы проверить, был ли установлен метод ... что сделало бы мой код еще более нечитаемым.Есть ли способ пакетной развернуть класс?Или, может быть, использовать попытку / ловить?

Как я могу улучшить?

Ответы [ 2 ]

3 голосов
/ 03 июля 2019

Это проблема «строителя», и у нее есть несколько решений.

Один из них - отделить изменяемые от неизменяемых структур.Создайте это с помощью изменяемого RequestBuilder с var необязательными значениями.Затем, когда он будет завершен, преобразуйте его в неизменяемый запрос с let необязательными значениями.Это заставит вас сделать этот гигант if-let один раз, но тогда это будет сделано.

Другой вариант - дать всем значениям значения по умолчанию.Как правило, коллекции (включая строки) не должны быть необязательными.Просто сделай их пустыми.

1 голос
/ 03 июля 2019

Метод строения Роба Напира кажется довольно хорошим.Вот еще одна идея.

У вас может быть функция на request, которая возвращает вам словарь, который нужно передать в apiRequest или nil, если какое-либо из значений не заполнено. У вас все еще естьбольшое guard утверждение, но оно только в одном месте:

extension Request 
{
    func makeDictionary() -> [String: String]?
    {
        guard let /* blah blah blah */ else { return nil }
        return [
                "description" : description,
                "total": totalAmount,
                "reserve": reserveAmount,
                "period":holdingPeriod,
                "from":sender,
                "to":receiver
            ]
    }
}

func save(request: Request, completion: @escaping WebServiceResponse){
        guard let body = request.makeDictionary() else { return }
        apiRequest(endpoint: apiEndpoint.Deal, path: "/save", body: body, completion: completion)
    }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...