2016-03-25 16 views
15

は、このコードを考えてみましょう。私は代わりにこのようなものを書いています:`if case`文を式として書く方法はありますか?総です</p> <pre><code>enum Type { case Foo(Int) case Bar(Int) var isBar: Bool { if case .Bar = self { return true } else { return false } } } </code></pre> <p>:

enum Type { 
    case Foo(Int) 
    case Bar(Int) 

    var isBar: Bool { 
     return case .Bar = self 
    } 
} 

しかし、このような構造はSwiftには存在しないようです。見つけられません。

それぞれのケースに関連付けられているデータがありますので、私はそれが上記の式と等価だ方法で~=オペレータ(または他のヘルパー)を実装することが可能だとは思いません。どんな場合でも、if caseステートメントはすべての列挙型に対して無料で存在し、手動で実装する必要はありません。

私の質問:上記のものよりisBarを実装するために、より簡潔な/宣言的な/きれいな/慣用的な方法がありますか?または、より直接的に、if caseの文をスウィフトとして表現する方法はありますか

+0

あなたはスイッチに関するこれらのコメントを見つけるかもしれないし、/ else文は_expressions_は「迅速な進化フォーラム」に掲載になっている場合に便利:https://github.com/apple/swift-進化/ blob/master/common_proposed.md。だから、残念ながら答えは「いいえ」です。 – CouchDeveloper

答えて

-2

?オペレーターをお探しですか?

documentation is here下位条件演算子タイトル。

+0

私はあなたがその質問を完全に読んだとは思わない。私はほとんどこれの反対を探しています。単項 '?case'演算子はありません。これは 'if'文を式に持ち上げる一般的なケースでは機能しますが、' if case'式を持ち上げることはできません。 –

+0

私はあなたがそれを連鎖できるという事実を見逃していると思う。 like:result = a> b? "より大きい":a

+0

演算子の連想性は 'if case'式と何が関係していますか? –

1

UPDATE 2: 別の回避策... ONLYケースに基づいてIntを返すvarを作成し、その後、静的使うだけ例等価性をテストするための方法(またはインスタンスを、私は静的にきれいに見えたと思いました) 。それはあなたが(あなたが1の静的メソッドを交換したい場合を除き)演算子をオーバーロードする必要はありません、Equatableと衝突しません、あなたも作成する必要はありません、別などvar isFoovar isBar

私はあなたがより一般的な質問をするためにこの例を使用したことを知っています(if caseを式として使用するにはどうすればよいでしょうか?)しかし、それが不可能なら、これは有効な回避策かもしれません。これは "症状" ではない "問題"

enum Something{ 
    case Foo(Int) 
    case Bar(Int) 

    static func sameCase(a: Something, b: Something) -> Bool { 
     return a.caseValue == b.caseValue 
    } 

    var caseValue: Int { 
     switch self { 
     case .Foo(_): 
      return 0 
     case .Bar(_): 
      return 1 
     } 
    } 

    //if necessary 
    var isBar: Bool { 
     return Something.sameCase(self, b: Something.Bar(0)) 
    } 
} 

Something.sameCase(.Bar(0), b: .Foo(0)) // false 
Something.sameCase(.Bar(1), b: .Foo(2)) // false 
Something.sameCase(.Foo(0), b: .Foo(0)) // true 
Something.sameCase(.Bar(1), b: .Bar(2)) // true 


Something.Bar(0).isBar // true 
Something.Bar(5).isBar // true 
Something.Foo(5).isBar // false 

UPDATE 1扱う場合、私は謝罪:

[OK]を、ので、これは動作しているようです。 ==演算子をオーバーロードして値を無視し、両方の列挙型が同じ場合にのみtrueを返すと、isFooメソッド内の任意の値を渡して型を決定することができます。

私はあなたが関連付けられている値に対応するために、この機能をカスタマイズする必要がありますと仮定していますが、それは正しい方向への一歩

enum Something { 
    case Foo(Int) 
    case Bar(Int) 

    var isFoo: Bool { 
     return self == .Foo(0) // number doesn't matter here... see below 
    } 
} 

func ==(a: Something, b: Something) -> Bool { 
    switch (a,b) { 
    case (.Bar(_), .Bar(_)): 
     return true 
    case (.Foo(_), .Foo(_)): 
     return true 
    default: 
     return false 

    } 
} 

let oneFoo = Something.Foo(1) 
let twoFoo = Something.Foo(2) 
let oneBar = Something.Bar(1) 
let twoBar = Something.Bar(2) 

oneFoo == twoFoo // true 
oneFoo == oneFoo // true 
oneFoo == oneBar // false 
oneFoo == twoBar // false 

OLDのように思える:あなたが使用することができます

selfcaseの名前を直接確認してください。caseキーワードを使用する必要はありません。うまくいけば、これはあなたの状況のた​​めに動作します:

enum Something{ 
    case Foo(Int) 
    case Bar(Int) 

    var isFoo: Bool { 
     switch self { 
     case Foo: 
      return true 
     case Bar: 
      return false 
     } 
    } 
} 
+0

これはopがenumを宣言した方法( 'case Foo(Int)'および 'case Bar(Int)')では機能しません。 – JAL

+0

switch文を使用する答えを編集しました。これをすべて1行でやってみようとしていますか? –

+0

欠陥:これはよりコードであり、望ましくないアプローチと意味的に同じであり、スケールが悪くなります。パターンマッチング式の問題は解決されません。別のタイプのステートメントを使用するだけです。 –

関連する問題