【问题标题】:Kotlin Enum to Basic Type mappingKotlin 枚举到基本类型的映射
【发布时间】:2020-09-15 06:00:57
【问题描述】:

我有一个登录 API,它接受一个字段 type 是“电子邮件”或“电话”。

我想让它们成为枚举

enum class LoginBodyType (val value: String) {
    EMAIL("email"), PHONE ("phone")
}

我有一个类似于以下的数据类

class LoginBody (val type: LoginBodyType) {
    var phone: String = ""
    var email: String = ""
    var password: String = ""
}

这样当我调用登录函数时,它会是这样的

val body = LoginBody(LoginBodyType.EMAIL)
body.email = username
body.password = password

类型将被固定为其中一个枚举,但它会作为字符串类型提交给服务器。

一种选择是使用body = LoginBody(LoginBodyType.EMAIL.value)class LoginBody (val type: String),但感觉好像有一个更优雅的解决方案。如果这很重要,我正在使用 Retrofit 2。

【问题讨论】:

    标签: android kotlin enums retrofit2


    【解决方案1】:

    您可以尝试使用sealed class。所以像:

    enum class LoginBodyType {
        EMAIL, 
        PHONE
    }
    sealed class LoginBody {
        data class Email(val email: String, val password: String)
        data class Phone(val phone: String)
    }
    
    val body = when(type) {
        LoginBodyType.EMAIL -> LoginBody.Email(email, pass)
        LoginBodyType.PHONE -> LoginBody.Phone(phone)
    }
    

    或者检查How to obtain all subclasses of a given sealed class?

    【讨论】:

      【解决方案2】:

      你可以这样做。

      enum class LoginBodyType {
        EMAIL, 
        PHONE;
        override fun toString(): String = name.toLowerCase()
      }
      
      val body = LoginBody(LoginBodyType.EMAIL)
      

      【讨论】:

      • 谢谢,这样更好,但在我的情况下,它仍然需要显式调用 .toString() 而不是 .value()。
      • 不,它不会很聪明,可以自动投射它。 LoginBody(LoginBodyType.EMAIL)
      猜你喜欢
      • 2019-08-14
      • 2018-08-01
      • 2019-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多