Swift 4 - Как я могу вызвать фрагмент кода, который возвращается из функции в нескольких функциях без дублирования кода? - PullRequest
0 голосов
/ 13 марта 2019

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

Я делаю много сетевых запросов в своем приложении к этому API, и когда я получаю ответ, мне нужно сначала проверить, является ли ответ массивом или словарем. Если массив, то у нас все хорошо. Если это словарь, то мне нужно проверить поле «ошибка» в словаре ответов, в котором будет 401 Несанкционированный.

Таким образом, каждый раз, когда я получаю ответ JSON, у меня есть следующий фрагмент кода для возврата из функции, если это словарь ошибок:

guard !(myJSON is NSDictionary) &&  (myJSON as! NSDictionary).value(forKey: "error") != nil else {
                    print("Error: ", MyAppError.accessTokenExpired)
                    return
                }

Мне интересно, есть ли способ предотвратить дублирование этого куска кода в каждой функции сетевого запроса, которую я имею? Могу ли я где-нибудь получить это и просто вызвать его, не дублируя эти строки кода каждый раз?

Ответы [ 2 ]

0 голосов
/ 14 марта 2019

Вы должны использовать типы данных swift, если вы используете язык Swift.Хотя если myJSON проверяется с помощью Dictionary, то оно обязательно будет подтверждено с помощью [String: Any].

Создать функцию, например:

func isValidResponse(_ json: Any) -> Bool {
    guard let jsonDict = json as? [String: Any], let let error = dict["error"] else { return true }
    print("Error: \(error.localizedDescription)")
    return false
}

Использовать ее как:

guard YourClass.isValidResponse(myJSON) else { return }

// Valid Response - Code here...
0 голосов
/ 13 марта 2019

Оберните это в функцию, подобную этой

func isErrorResponse(_ response: Any) -> Bool {
    if let dict = response as? [String: Any], let error = dict["error"] {
        print("Error: \(MyAppError.accessTokenExpired)")
        return true
    }
    return false
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...