Swift перечисляет несколько случаев с одинаковым значением

В C вы можете сделать свои перечисления

typedef enum _Bar {
    A = 0,
    B = 0,
    C = 1
} Bar;

В быстрой я хочу сделать эквивалент. Однако компилятор жалуется, что он не уникален. Как я могу сказать, что я хочу, чтобы два случая имели одинаковое значение?

enum Bar : Int {
    case A = 0
    case B = 0 //Does not work
    case C = 1
}

Ive попробовал

case A | B = 0

и

case A, B = 0

Но он, похоже, не работает так, как я этого хочу. Я ценю любую помощь.

Ответы

Ответ 1

Swift не поддерживает дублированные значения. (или "псевдонимы" семантически). Если вы не возражаете, вы можете имитировать это, используя что-то вроде этого.

enum Foo: Int {
    case Bar = 0

    static var Baz:Foo {
        get {
            return  Bar
        }
    }
    static var Jar:Foo {
        get {
            return  Foo(rawValue: 0)!
        }
    }
}

Ответ 2

Swift не позволяет элементам enum делиться значениями. Из документации по перечислениям под заголовком "Необработанные ценности" (выделение):

Необработанные значения могут быть строками, символами или любыми типами чисел с целыми числами или с плавающей запятой. Каждое необработанное значение должно быть уникальным в объявлении перечисления.

Ответ 3

Я не уверен, что ты сможешь. Из Apple взято следующее.

"В отличие от C и Objective-C членам Swift перечисления не присваивается целочисленное значение по умолчанию при их создании. В приведенном выше примере CompassPoints Север, Юг, Восток и Запад неявно не равны 0, 1, 2 и 3 Вместо этого различные члены перечисления являются полностью самостоятельными значениями, с явно определенным типом CompassPoint.

Отрывок из: Apple Inc. "Быстрый язык программирования". интерактивные книги. https://itunes.apple.com/us/book/swift-programming-language/id881256329?mt=11

Поскольку члены перечисления неявно не равны 0, 1 и т.д., компилятор рассматривает каждый как уникальное значение. Когда вы пытаетесь дублировать его, компилятор жалуется, потому что он уже создан.

Есть ли причина, по которой вам нужно дублировать значение?

Ответ 4

Вот еще один способ обойти это:

enum Animal {

  case dog
  case cat
  case mouse
  case zebra

  var description: String {
    switch self {
    case .dog:
      return "dog"

    case .cat:
      return "dog"

    case .mouse:
      return "dog"

    case .zebra:
      return "zebra"

    default:
      break
    }
  }
}

Ответ 5

Я сталкиваюсь с той же проблемой, что и для нескольких случаев с одинаковым значением. После этой проблемы я предпочел следующее решение с computed properties enum, которое появилось из этого сообщения.


Swift enum properties