Kotlin相当于Swift字符串枚举(字符串常量的类型化集合)

bbj*_*jay 2 enums kotlin swift

我有以下Swift枚举:

enum ScreenName: String {
    case start = "Start Screen"
    case dashboard = "My Dashboard Screen"
}
Run Code Online (Sandbox Code Playgroud)

这使我可以拥有一组类型化的常量,并像下面这样使用它们:

func trackView(screen: ScreenName) {
     print("viewed \(screen.rawValue)")
}

trackView(screen: .start) // -> "viewed Start Screen"
Run Code Online (Sandbox Code Playgroud)

在Kotlin中这相当于什么?

小智 6

就像是:

enum class ScreenName(val displayName : String) { 
  START("Start Screen"), 
  DASHBOARD("My Dashboard Screen") 
}

fun trackView(screenName : ScreenName) {
  print("viewed ${screenName.displayName}")
}
Run Code Online (Sandbox Code Playgroud)


bbj*_*jay 5

我现在发现的另一种可能性是使用密封类:

sealed class ScreenName(val name : String) {
    object Start :     ScreenName("Start Screen")
    object Dashboard : ScreenName("My Dashboard Screen")

    data class NewsDetail(val title: String) : ScreenName("News")

    val displayName: String
        get() = when(this) {
            is NewsDetail -> "${name} - ${title}"
            else -> name
        }
}
Run Code Online (Sandbox Code Playgroud)

这样做的好处是它可以模拟带有关联值的 Swift 枚举。

  • 类型化枚举不是具有关联值的枚举,它们是不同的概念。OP 中的 Swift 示例使用枚举,其中值*是*字符串,而关联的字符串值仍然是一个 int,就像每个普通枚举一样,它有一个与之*关联的字符串值。 (2认同)