2017-12-30 22 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] 
     } 
    } 
} 

をまたは構造体の機能にそれを回す:OK(

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

の配列や辞書を返す必要があります。返信ありがとうございます。トライアドが本当に返すものはスケール指向です。そのため、私はスケール定義に残しておきたいと思います。私が本当にやりたいことは、例えば、fordを呼び出すのとは異なる構文であるscale.triad.tonicを使って、別の構造体、例えばChordを初期化することです。 –

関連する問題