2015-01-20 2 views
17

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

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 

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

ответ

13

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

enum Foo: Int { 
    case Bar = 0 

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

Или, поскольку свойства подразумевают наличие геттер-кода, если не заданы ни '' get', ни 'set', вы можете сократить их до' static var Baz: Foo {return Bar} 'и' static var Jar: Foo {return Foo (rawValue: 0)! } '. –

+0

Или, кажется, в Swift 3, сохраненные свойства класса будут работать так: «static let Baz = Foo.Bar» и 'static let Jar = Foo (rawValue: 0)!'. –

5

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

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

+2

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

3

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

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

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

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

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

+0

Да, я хочу использовать перечисления для представления указательных путей. В разных разделах будет перечисление, а имена строк будут связаны с индексом строки. Индекс строк может быть одного и того же значения, но иметь разные разделы. – DerrickHo328

+1

Это похоже на то, что вы хотите создать структуру, а не перечислить. –

3

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

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 
    } 
    } 
} 
0

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


Swift enum properties