2016-07-12 2 views
4

私は基本的な相対位置を記述するために、そのようなネストされた列挙型を持っている:Swiftのswitch文によるアクセスのために列挙型をネストする最も良い方法は?

enum Location { 
    enum Top { 
     case Left 
     case Right 
     case Center 
    } 
    enum Bottom { 
     case Left 
     case Right 
     case Center 
    } 
    enum Left { 
     case Top 
     case Bottom 
     case Center 
    } 
    enum Right { 
     case Top 
     case Bottom 
     case Center 
    } 
    enum Center { 
     case Center 
    } 
    } 

私はそれでswitchステートメントを実行しようとすると、列挙型のいずれも可能なケースとして表示しない、と私はリストにしようとした場合Enum case 'Top' not found in type 'Location'.

は今、この質問hereのバージョンがあります、そして最も有用な答えによれば、SH:

func switchOverEnum(enumCase: Location) { 
    switch enumCase { 
    case .Top: 
    print("hey this didn't cause an error whoops no it did") 
    } 
} 

エラーがある:彼らは、私はエラーを取得しますこのように行うことがウルド:完全に動作しますが、少し不格好、または洗練、または非スウィフト-のように思える

enum Location { 
    enum TopLocations { 
     case Left 
     case Right 
     case Center 
    } 
    enum BottomLocations { 
     case Left 
     case Right 
     case Center 
    } 
    enum LeftLocations { 
     case Top 
     case Bottom 
     case Center 
    } 
    enum RightLocations { 
     case Top 
     case Bottom 
     case Center 
    } 
    enum CenterLocations { 
     case Top 
     case Bottom 
     case Left 
     case Right 
     case Center 
    } 
    case Top(TopLocations) 
    case Bottom(BottomLocations) 
    case Left(LeftLocations) 
    case Right(RightLocations) 
    case Center(CenterLocations) 
    } 

を。これは本当に最善の方法ですか?

+1

なぜそれがうまくいかないのですか?これは、シンプルなことを最大限に複雑にします。これは完全に汗だくです。 –

+0

あなたが何を求めているのか不明です。あなたのオリジナルはちょうど愚かでした( '.Top'はLocationのケースではなく、ネストされた列挙型なので、あなたが期待していたものを想像するのは難しいです)。そして、"最善の方法 "は意見の問題です。 – matt

+0

私はこの質問を主に意見に基づいて終了するよう投票しています。回答は意見ではなく、嗜好に基づくものであり、事実ではありません。完全な、実際の例で[コードレビュー](http://codereview.stackexchange.com)に投稿することを検討してください。 – JAL

答えて

3

これは、2つの列挙型とタプルでより簡潔に表現できると思います。遊び場でこれを試してみてください:

enum HorizontalPosition { 
    case Left 
    case Right 
    case Center 
} 

enum VerticalPosition { 
    case Top 
    case Bottom 
    case Center 
} 

typealias Location = (horizontal: HorizontalPosition, vertical: VerticalPosition) 

let aLocation = Location(horizontal: .Left, vertical: .Bottom) 

switch aLocation { 

case (.Left, .Bottom): print ("left bottom") 
case (.Center, .Center): print ("center center") 
default: print ("everything else") 
} 
+0

質問が閉ざされているにもかかわらず、信用を得るべきです。これはすばらしい答えです。ありがとう! –

+0

@LeMotJuicedありがとう!私が助けてくれることを願った –

関連する問題