【发布时间】:2021-02-17 10:35:35
【问题描述】:
我正在尝试创建一个服务类,该服务类也将具有相应 api 的解码类类型
import UIKit
struct LoginResponse: Codable {
var action: String
var result: String
var key: String
}
struct LogoutResponse: Codable {
var action: String
var result: String
}
enum Api {
case login
case logout
var backingType: Codable {
switch self {
case .login:
return LoginResponse.self as! Codable
case .logout:
return LogoutResponse.self as! Codable
}
}
}
let loginResponse = LoginResponse(action: "login", result: "result", key: "key")
let loginData = try! JSONEncoder().encode(loginResponse)
let decodedData = try! JSONDecoder().decode(Api.login.backingType, from: loginData)
我得到的错误是 ->
**无法将类型“Codable.Type”(又名“(Decodable & Encodable).Type”)的值转换为预期的参数类型“T.Type”
无法推断通用参数“T”。**
我也尝试过使用泛型
import UIKit
struct LoginResponse: Codable {
var action: String
var result: String
var key: String
}
struct LogoutResponse: Codable {
var action: String
var result: String
}
enum Api<T: Codable> {
case login
case logout
var backingType: Codable.Type {
switch self {
case .login:
return LoginResponse.self
case .logout:
return LogoutResponse.self
}
}
var genericBackingType: T.Type {
switch self {
case .login:
return LoginResponse.self as! T.Type
case .logout:
return LogoutResponse.self as! T.Type
}
}
}
let loginResponse = LoginResponse(action: "login", result: "result", key: "key")
let loginData = try! JSONEncoder().encode(loginResponse)
let decodedData = try! JSONDecoder().decode(Api.login.backingType as! Codable.Type, from: loginData)
请指点我一个合适的方向
【问题讨论】:
-
您希望
decodedData的类型是什么? -
@Sweeper 来自 backingType 变量的结构对象。如果通过登录,则它应该是 LoginResponse 类型,否则是 LogoutResponse。