2014-09-22 3 views
1

에 열거 값을 스와핑 다음과 같은 코드가 어떤 방식으로 단축/최적화 할 수 있는지 궁금 해서요 :내가 현재 스위프트 아주 새로운 해요 스위프트

enum CardOrientation { 
    case Horizontal, Vertical 
} 

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

이의는 CardOrientation 그냥이가 항상 것이라고 가정하자 두 가지 가능한 값과 toggleCurrentCardOrientation에 대한 모든 호출은 각각의 값 사이에서 토글해야합니다.

답변

4

두 가지 가능한 솔루션 :

사용 부울 대신 (예를 들어 isCardOrientationHorizontal는)

Bools는 전환하기가 매우 쉽습니다 : isCardOrientationHorizontal = !isCardOrientationHorizontal

추가 열거 형 토글 방법 :

enum CardOrientation { 
    case Horizontal, Vertical 

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

+1 두 가지 접근법을 제공합니다. 처음에는 Bool을 사용하려고했지만, 어떻게 든 더 명백한 방식으로 만드는 멋진 ". 수직"구문을 사용할 수있는 것을 선호합니다. – BastiBen

1

토글 메서드를 열거 형 자체로 옮깁니다. 그런 다음 메서드를 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, 일반적으로 사실이지만, 토글 기능의 경우 두 개 이상은 의미가 없습니다. –

0

글쎄, 당신은 내가를 돌연변이하지 않으려는, 열거 자체

enum CardOrientation { 
    case Horizontal, Vertical 

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

swap 함수를 정의하고 개인 문체 참고로

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

처럼 사용할 수 있습니다 인스턴스 자체가 가변 상태를 도입하면 코드에 대한 추론이 점점 어려워집니다.

0

본래 flippable 인 enum은 동일한 특성과 관련된 원래 값을 가져야합니다. Bool은 원시 형식 (본능)으로 사용할 수 없으므로이 방법을 사용하십니까? truefalse가에 리터럴 된 이후 버그 -might 보조 노트에

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

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

은 ... Bool가 used- 할 수없는 이유 "어떤 문자가 원시 형 'BOOL'는 변환되지 않습니다" 베타 중 하나.