Swift Codable Создайте Failable Generic Structure - PullRequest
0 голосов
/ 13 февраля 2019

Допустим, у меня есть API входа и ответ для успешного входа в систему и сбой входа отличается

Я хочу сделать этот общий способ

У меня точно есть метод, который API вызова и я передаю T: кодируемый для кодирования ответа

typealias completionResponse<T:Codable> = ((_ success:T?,_ error:Error?) -> Void)

static func login<T:Codable>(userName:String,password:String,completion:@escaping completionResponse<T>) {
        self.performRequest(request: APIRouterUserModule.login(email: userName, password: password)) {(model) in

            self.handleResponseCallCompletion(result: model, completion: completion)
        }
    }

Теперь я создал следующее для решения этой проблемы.

struct FailableResponse <T:Codable,E:Codable> : Codable {

    var success:T?
    var failure:E?

    public init(from decoder:Decoder) throws {

        let singleValue = try decoder.singleValueContainer()
        success = try singleValue.decode(T.self)

        failure = try singleValue.decode(E.self)
    }
}

Проблема:

проблема в том,Предположим, что вход успешен, поэтому в этом случае я хотел, чтобы failure было равно нулю.

и наоборот для сбоя входа в систему. Я хотел success должен ноль.

Но что происходит, ни один из них не равен nil и success и failureне ноль. Однако значения опций внутри являются ноль

Так есть ли обходной путь для этого?

Заранее благодарим за ваши усилия :) 1029 *

...