2017-12-30 33 views
0

열거 형과 구조체 사이의 관계를 구축하려고합니다. 열거 형의 각 요소를 반환하는 구조체에 계산 된 속성을 갖고 싶습니다. 그러나 구조체에는이 열거 형 인스턴스가 없으며 정적 구현에 가깝습니다. 이 코드가 제대로 작동하도록 구문에 대한 제안을 찾고 있습니다. 또는 아마도 내 형식을 나타내는 더 좋은 방법 일 것입니다. 다음은 예제 코드입니다 :구조체 관련 열거 형의 계산 된 속성

enum ScaleDegree: Int { 
    case tonic 
    case supertonic 
    // there's more... 
} 

struct Scale { 
    // among other things, 
    // returns scale notes for the diatonic chords associated with the ScaleDegree 
    var triad: [Int] { 
     switch ScaleDegree { 
     case .tonic: return [1, 3, 5] 
     case .supertonic: return [2, 4, 6] 
     } 
    } 
} 

물론 위의 코드는 컴파일되지 않습니다. 그러나, 그것은 내가하려는 일의 좋은 예입니다. 이 예제에서는 ScaleDegree의 인스턴스를 Scale에서 원하지 않지만 Scale이 모든 ScaleDegree에 대해 결과를 제공 할 수있게하려고합니다. 이렇게하는 우아한 방법에 대한 제안?

+0

전산화 속성이나 기능은 한 가지를 반환 할 수 있습니다 그것을 튜플과 같은 여러 항목으로 구성 될 수 있습니다.) 그래서 어떤 트라이어드가 반환 될 것이므로 원하는 것을 수행 할 수 없습니다. 트라이어드가 열거 형에 대한 모든 가능한 조합을 반환하도록하려면 배열 또는 사전 [Int] –

답변

0

당신은 열거 자체의 triad 부분을 만들 수 있습니다

enum ScaleDegree: Int { 
    case tonic 
    case supertonic 

    var triad: [Int] { 
     switch self { 
     case .tonic: 
      return [1,3,5] 
     case .supertonic: 
      return [2,4,6] 
     } 
    } 
} 

을 또는 구조체의 함수로 돌려 : 확인 (

struct Scale { 
    func triad (degree: ScaleDegree) -> [Int] { 
     switch degree { 
     case .tonic: return [1, 3, 5] 
     case .supertonic: return [2, 4, 6] 
     } 
    } 
} 
+0

을 반환해야합니다. 답장을 보내 주셔서 감사합니다. 트라이어드가 반환하는 것은 Scale 지향이기 때문에 Scale 정의에 보관하고 싶습니다. 제가 정말로하고 싶은 것은 예를 들어, ford를 호출하는 것과는 다른 구문 인 scale.triad.tonic을 사용하여 코드 구조체를 다른 구조체로 초기화하는 것입니다. –