解析代码类并避免重复

  • 本文关键字:代码 swift codable
  • 更新时间 :
  • 英文 :


我的json响应如下:

{
  "http_status": 200,
  "success": true,
  "has_error": false,
  "error": [
    ""
  ],
  "response": {
    "token": "",
    "verified": false,
    "message": ""
  }
}

据我所知,应用程序API用法http_status,成功,has_error,在所有API之间共享错误,因此我将创建一个可编码类来处理它,但是响应可能是不同的模型,所以这就是什么我正在尝试做。

我已经创建了一个常规响应类,因此我可以在项目中的所有API使用此类,以避免重复同一类,但名称不同:

class GeneralResponse:Codable {
    let http_status: Int?
    let success, has_error: Bool?
    let error: [String]?
    enum CodingKeys: String, CodingKey {
        case http_status = "http_status"
        case success = "success"
        case has_error = "has_error"
        case error = "error"
    }
    init(http_status: Int?, success: Bool?, has_error: Bool?,error: [String]?) {
        self.http_status = http_status
        self.success = success
        self.has_error = has_error
        self.error = error
    }
}

现在,我创建了响应类,该类别将处理现在的注册响应:

class RegistrationResponseDetails: Codable {
    let token: String?
    let verified: Bool?
    let message: String?
    init(token: String?, verified: Bool?, message: String?) {
        self.token = token
        self.verified = verified
        self.message = message
    }
}

,可以说我需要解析注册响应,所以这是我所做的,我创建了一个班级并使用了这两个:

class RegistrationResponse: Codable {
    let generalResponse:GeneralResponse?
    let response: RegistrationResponseDetails?
    init(generalResponse: GeneralResponse?, response: RegistrationResponseDetails?) {
        self.generalResponse = generalResponse
        self.response = response
    }
}

因此,我将主要使用registrationResponse来解析响应,该响应将解析包括http_status,成功,has_error,error,错误,然后响应将解析所需的响应对象。

但在某个时候,通用物源对象始终为零,并且响应正确解析了数据,我该怎么做才能使GeneralResponse在每个API中无需重复,因为在每个API中,我都会有通用响应对象,因此可以求解它?

注意:我正在使用Alamofire作为网络库。

您可以制作GeneralResponse通用,并告诉解析响应时要使用哪种类型:

class GeneralResponse<T: Codable>: Codable {
    let http_status: Int?
    let success, has_error: Bool?
    let error: [String]?
    let response: T?
}
class RegistrationResponseDetails: Codable {
    let token: String?
    let verified: Bool?
    let message: String?
}

然后,当您解析JSON:

时,您可以给它一个内部响应类别
let generalResponse = try JSONDecoder().decode(GeneralResponse<RegistrationResponseDetails>.self, from: jsonData)
// generalResponse.response is of type RegistrationResponseDetails?

首先,如果

http_status,成功,has_error,在所有apis之间共享错误

为什么类属性可选?


如果提到的键相同,但是键response的值不同。

在大多数情况下struct S足够。

struct JSONParser<T : Decodable> {
    struct Response<U : Decodable> : Decodable {
        let httpStatus: Int
        let success, hasError: Bool
        let error: [String]
        let response : U
    }
    let responseData : Response<T>
    init(data: Data) throws {
        let decoder = JSONDecoder()
        decoder.keyDecodingStrategy = .convertFromSnakeCase
        responseData = try decoder.decode(Response.self, from: data)
    }
}

然后创建不同的结构,例如

struct RegistrationResponseDetails : Decodable {
    let token: String
    let verified: Bool
    let message: String
}

并解析

let parser = try JSONParser<RegistrationResponseDetails>(data: data)
let registrationResponseDetails = parser.responseData.response

对于简单的情况

class Main:Decodable { 
    let name:String?   // insert all shared vars 
} 
class Sub:Main { 
   let id:String? 
} 

这将分析

{
     "name" : "rr" , 
     "id" : "oo"  
}

相关内容

  • 没有找到相关文章

最新更新