在 Decodable class | 中为 属性 设置一个 Alter 名称Swift

Set an Alter name for property in Decodable class | Swift

我正在为 IOS Swift UI.

开发现有的 Android Kotlin 应用程序

在 Kotlin 中使用 Gson 时,我有一个客户端模型 class:

abstract class Client(
        @SerializedName("nombre")
        var name: String? = null,
        @SerializedName(value="cliente_id", alternate = ["id"])
        var client_id: Int = -1,
)

如您所见,我使用 @SerializedName() 给客户 属性 nameclient_id 一个别名。我这样做是因为当我从 API 获取数据时,客户端 Json 具有“nombre”而不是我想要的“name”。因此 @SerializedName() 可以将 JSON 中的“nombre”检测为“name”或将“cliente_id”检测为 Kotlin 模型 类 中的“client_id”。这样我就可以使用我自己的 属性 名称从 API 读取数据。

好吧,现在我在 Swift 中遇到了同样的问题。我想使用自己的 属性 名称,而不是 API JSON 属性 名称。

我的 swift 客户端模型 class 如下所示:

class Client: Identifiable, Decodable{
    
    init(id: Int, token: String) {
        self.cliente_id = id
        self.token = token
    }
    
    let cliente_id: Int
    let token: String
}

然后我从 API 中获取客户数据,如下所示:

let request = AF.request(
    url, method: .post,
    parameters: parameters,
    encoder: JSONParameterEncoder.default
)

request.validate(statusCode: 200...299)
request.responseDecodable(of: Client.self) { response in
    if let loginResponse = response.value{//Success
        loginPublisher.send(loginResponse)
    }
    else{//Failure
        loginPublisher.send(completion: Subscribers.Completion<NetworkError>.failure(.thingsJustHappen))
    }
}

为了能够使用 Client 可解码,Client 必须实施 Decodable。好吧,我想要的只是客户有 id 而不是 cliente_id 作为 属性 名称。

类似

class Client: Identifiable, Decodable{

    init(id: Int, token: String) {
        self.id = id
        self.token = token
    }

    @NameforDecode("cliente_id")
    let id: Int
    let token: String
}

这可能吗?

在 Swift 中,您可以通过自定义类型来实现此目的 CodingKeys:

extension Client: Decodable {

    enum CodingKeys: String, CodingKey {
        case id = "cliente_id"
        case token
    }
}

枚举案例必须与您的属性相对应;如果 JSON 中的键与您的 属性 名称不匹配,则可以将原始值声明为 StringEncoding and Decoding Custom Types 开发者文章中有更多信息。