Я бы использовал Codable
и enum
для этого, но учтите следующее:
Сначала реализуйте enum
с любым возможным ответом:
enum LoginDriverResponseValue {
case dictionary([String: Any])
case array([[String: Any]])
case string(String)
case unknown(Any)
}
, затем изменитесигнатура функции для адаптации с этим перечислением:
func afLoginDriver(firstName: String, password: String, completion: @escaping (LoginDriverResponseValue)->Void) {
,,,
}
И, наконец, включите перечисление и вызовите соответствующее завершение:
guard let responseValue = response.value else { return }
switch responseValue {
case let result as [String: Any]: completion(.dictionary(result))
case let result as [[String: Any]]: completion(.array(result))
case let result as String: completion(.string(result))
default: completion(.unknown(responseValue))
}
- Более инкапсулированный способ:
youможет инкапсулировать определение типа responseValue
в enum LoginDriverResponseValue
:
extension LoginDriverResponseValue {
init(responseValue: Any) {
switch responseValue {
case let result as [String: Any]: self = .dictionary(result)
case let result as [[String: Any]]: self = .array(result)
case let result as String: self = .string(result)
default: self = .unknown(responseValue)
}
}
}
Таким образом, единственное, что вам нужно в функции, будет:
guard let responseValue = response.value else { return }
completion(LoginDriverResponseValue(responseValue: responseValue))