Kotlin: пропуск имени enum, когда оно однозначно - PullRequest
1 голос
/ 28 февраля 2020

С помощью Swift enum вы можете опустить имя 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, где можно использовать только .north или north?

Редактировать: кажется, что импорт enum «исправляет» это и необходимо, даже когда enum определен в том же файле, что и используемый.

Хотя это помогло практически я до сих пор не понимаю, зачем нужен импорт.

Ответы [ 2 ]

5 голосов
/ 28 февраля 2020

Просто используйте импорт, чтобы вы могли использовать значения перечисления без имени перечисления

  import CompassPoint.*
1 голос
/ 29 февраля 2020

Редактировать: кажется, что импорт enum «исправляет» это и необходимо, даже когда enum определен в том же файле, в котором он используется.

Хотя это помогло практически, я все еще не понимаю не понимаю, зачем нужен импорт.

Просто потому, что он не обрабатывается специально. import CompassPoint.* позволяет писать просто <name> для всего, что вы пишете как CompassPoint.<name> без него (если имя не конфликтует ни с чем). Если вы оказались в файле, где определен CompassName, он работает точно так же.

Вы можете ссылаться на значения как north et c. без импорта внутри определения enum , точно так же, как вы можете ссылаться на элементы object внутри этого объекта:

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

val v2 = Obj.v

или

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