2014-09-22 3 views
1

Я в настоящее время очень новый Swift и мне было интересно, если следующий код может быть оптимизирован/укорочен в любом случае:Перестановка значение перечисления в Swift

enum CardOrientation { 
    case Horizontal, Vertical 
} 

func toggleCurrentCardOrientation() { 
    switch currentCardOrientation { 
    case .Horizontal: currentCardOrientation = .Vertical 
    case .Vertical: currentCardOrientation = .Horizontal 
    } 
} 

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

ответ

4

два возможных решения:

Используйте Bool вместо (например isCardOrientationHorizontal)

Bools очень легко переключаться: isCardOrientationHorizontal = !isCardOrientationHorizontal

Добавить toggle метод для вашего перечисления:

enum CardOrientation { 
    case Horizontal, Vertical 

    mutating func toggle() { 
     switch self { 
      case .Horizontal: 
       self = .Vertical 
      case .Vertical: 
       self = .Horizontal 
     } 
    } 
} 
+0

+1 для обеспечения двух разных подходов. Сначала я рассматривал возможность использования Bool, но я почему-то предпочитаю использовать отличный «.Vertical» синтаксис, который делает его более очевидным, что происходит. – BastiBen

1

Я бы переместил метод toggle к самому перечислению. Затем отметьте способ как mutating, чтобы благословить его возможностью обновить себя. И учитывая, что есть только два варианта, switch кажется излишним. Вы можете просто использовать if/else. Но если у вас когда-либо было более двух вариантов, то смысл имеет смысл switch.

Например:

enum CardOrientation { 
    case Horizontal, Vertical 
    mutating func toggle() { 
     if self == .Horizontal { 
      self = .Vertical 
     } else { 
      self = .Horizontal 
     } 
    } 
} 

var currentCardOrientation: CardOrientation = .Horizontal 
currentCardOrientation.toggle() 
currentCardOrientation // .Vertical 
currentCardOrientation.toggle() 
currentCardOrientation // .Horizontal 
+0

Я бы сказал, что переключатель предпочтительнее для оператора if, если он добавит еще один случай в будущем. Лучше иметь компилятор в качестве системы безопасности, чтобы убедиться, что все случаи учтены. – drewag

+0

Возможно, вы правы. –

+0

@drewag, вообще говоря, это правда, но в случае функции «toggle» более двух имеет мало смысла. –

0

Ну, вы можете определить swap функцию на самом перечислении

enum CardOrientation { 
    case Horizontal, Vertical 

    func swap() -> CardOrientation { 
     switch(self) { 
     case Horizontal: return Vertical 
     case Vertical: return Horizontal 
     } 
    } 
} 

и использовать его как

func toggleCurrentCardOrientation() { 
    currentCardOrientation = currentCardOrientation.swap() 
} 

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

0

Мне кажется, что enum, являющийся неотъемлемой частью, должен иметь связанное с ним значение с тем же признаком. Поскольку Bool не может использоваться как необработанный тип (ваш первый инстинкт), как насчет этого?

enum CardOrientation: Int { 
    case Horizontal = -1, Vertical = 1 

    mutating func toggle() { 
     self = CardOrientation.fromRaw(-self.toRaw())! 
    } 
} 

На стороне записки ... причина Bool не в состоянии быть используется- «Raw типа„Bool“не конвертируется из любого литерала» -might быть ошибкой, так как true и false стали литералами один из бета.

Смежные вопросы