2017-11-05 13 views
2

swift enumオブジェクトの関連する値を取得したいのですが、以下のswitch文より短く/よりうまくいく方法がありますか?複数の列挙型から関連する値を抽出するためのスウィフトの大文字小文字に関係なく列挙型から関連する値を抽出する

enum Test { 
    case a(Int), b(Int), c(Int) 
} 

func printValue(_ t: Test) { 
    switch t { 
     case .a(let v), .b(let v), .c(let v): print("value \(v)") 
    } 
} 
+0

N o、 – paper1111

答えて

2

あなたのコードでは、それを改善する必要はありません、最も経済的で読みやすいです。

enumの大文字と小文字を区別せずに関連する値を抽出しようとしているということは、関連する値を正しく使用していないことを示しています。関連する値なしIntenumを保持している、すなわち

enum Test { 
    case a, b, c 
} 
class MyClass { 
    var num : Int 
    var tst : Test 
} 

今関連付けられた値が、各enum要素「外」であること、それは独立して例にアクセスすることができ、あなたもそれに意味のある名前を付けることができますこれにより、プログラムの可読性が向上します。

+2

はありません。残念ながら、列挙型は第三者のライブラリから来ているので、私はそれを制御することはできません。 – frangulyan

+0

@frangulyan 'enum'がコードの外部にあるのはおそらく、このコードを最初に使用する唯一の正当な理由です。 – dasblinkenlight

+0

あなたの判断の背後にある理由を考えることができれば参考になる - https://github.com/parse-community/ParseLiveQuery-iOS-OSX/blob/master/Sources/ParseLiveQuery/Subscription.swift#L71私はFacebookのパースチームは、オープンソース化する前に、コードの背後にありました。 – frangulyan

-1

あなたはミラータイプを使用することがあります - それは良い方法ではないが、それはいくつかのケースで役に立つことができます:あなたがする必要がある場合

enum Test { 
    case a(Int), b(Int), c(Int) 
} 

func printValue(_ t: Test) { 
    let mirror = Mirror(reflecting: t) 
    print(mirror.children.first?.value ?? "") 
} 

printValue(.a(15)) 

もあれば/このようなケースを使用して、それが短い方法です唯一のケースから抽出値、時にはそれが便利です:

if case .a(let val) = t { 
    print("value \(val)") 
} 

またはRAW値であってもよいが、あなたのケースのためのより良いフィットします:

enum Test: Int { 
    case a = 1 
    case b = 2 
    case c = 5 
} 

func printValue(_ t: Test) { 
    print("value \(t.rawValue)") 
} 

printValue(.a) 
+1

2番目の例は、関連付けられた値ではありません。 – paper1111

+0

@ paper1111、そうではありません。別のアプローチを提案しています。 –

関連する問題