【问题标题】:Kotlin: Omitting enum name when its unambiguousKotlin:当枚举名称明确时省略枚举名称
【发布时间】:2020-06-12 22:48:30
【问题描述】:

对于Swift enums,您可以省略enum 的名称,以防只能使用该类型的值。

所以当给定枚举时(Swift/Kotlin)

enum (class) CompassPoint {
  case north
  case south
  case east
  case west
}

Swift 创建新变量时只需要枚举名称:

// type unclear, enum name needed
var directionToHead = CompassPoint.west

// type clear, enum name can be dropped
directionToHead = .east

// type clear, enum name can be dropped
switch directionToHead {
case .north:
  print("Lots of planets have a north")
case .south:
  print("Watch out for penguins")
case .east:
  print("Where the sun rises")
case .west:
  print("Where the skies are blue")
}

在 Kotlin 中,对于相同的情况,您必须编写

// type unclear, enum name needed
var directionToHead = CompassPoint.west

// type clear, enum name still needed
directionToHead = CompassPoint.east

// each case needs the enum name
when(directionToHead) {
  CompassPoint.north -> println("Lots of planets have a north")
  CompassPoint.south -> println("Watch out for penguins")
  CompassPoint.east -> println("Where the sun rises")
  CompassPoint.west -> println("Where the skies are blue")
}

这是否有原因,和/或在 Kotlin 中是否存在只能使用 .northnorth 的情况?

编辑:似乎导入枚举“修复”了这个问题,即使枚举定义在与它使用的文件相同的文件中也是必要的。

虽然这实际上有所帮助,但我仍然不明白为什么需要导入。

【问题讨论】:

  • 如果添加枚举的静态导入,枚举类名可以省略。

标签: kotlin enums kotlin-when


【解决方案1】:

只需使用导入,因此您可以使用没有枚举名称的枚举值

  import CompassPoint.*

【讨论】:

  • CompassPoint 在与when 相同的文件中定义。编辑:哦..但它仍然修复它。那太奇怪了..但是谢谢!
  • 即使在同一个文件或同一个类中,也需要导入
【解决方案2】:

编辑:导入枚举似乎“修复”了这个问题,即使枚举定义在与使用相同的文件中也是必要的。

虽然这实际上有所帮助,但我仍然不明白为什么需要导入。

只是因为它没有经过特殊处理。 import CompassPoint.* 让你只写<name> 来写任何你想写成CompassPoint.<name> 没有它的东西(如果名称不与任何东西冲突)。如果您碰巧在定义CompassName 的文件中,它的工作原理完全相同。

您可以将值引用为north 等,而无需在枚举定义内导入,就像您可以在此对象内引用object 的成员一样:

object Obj {
    val v = 0
    val v1 = v
}

val v2 = Obj.v

import Obj.* // or import Obj.v
val v2 = v

【讨论】:

    【解决方案3】:

    FWIW,Kotlin 团队正在考虑在枚举类型明确时实现非限定枚举常量。

    他们目前正在进行一项功能调查以收集反馈,unqualified enum constants 也在其中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-18
      • 2019-03-04
      • 1970-01-01
      • 2015-08-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多