2015-11-12 9 views
31

私の意見では、色の変数は、以下に書かれたスイッチの場合にはアンラップされてはならないが、アンラップしていないコンパイラは私にエラーメッセージを表示するので、気が変わっています。enumとswitchの場合アンラッピングを強制するのはなぜですか?

enum Colours: Int { 
case Red = 0, White, Black 
} 

var colours: Colours! 
colours = .Red 

switch colours! { // <-- why I have to unwrap colours? As you can see colours are declared as '!' 
case .Red: break 
default: break 
} 

色変数は開封されたコンパイラでない場合は、私にそのエラーを示しています。私の意見では enter image description here

それが迅速矛盾である、誰もがいくつかのアイデアを持っているのでしょうか?

答えて

32

switchステートメントで使用された場合、暗黙的にアンラップされた オプションも、ではなく、が自動的にアンラップされます。

だからあなたは(いずれかを強制的にで colours!colours == nil場合、またはオプションの結合とクラッシュします)アンラップしなければならない(。その理由は、あなたが そうnilに対してそれらを一致させることができなかったことかもしれません)、または - 代わり - 戦.Red? .Some(.Red)ためのショートカットです:、同じことが他のパターンマッチング表現のために保持している例

var colours: Colours! 

switch colours { 
case .Red?: 
    break // colours is .Red 
default: 
    break // colours is .White, .Black or nil 
} 
if case .Red? = colours { 
    // colours is .Red 
} else { 
    // colours is .White, .Black or nil 
} 

また、これは、列挙型とは何の関係もないパターンのみで、暗黙的に 開封されたoptionalsで:

let x : Int! = 1 

switch x { 
case nil: 
    break // x is nil 
case 1?: 
    break // x is 1 
default: 
    break // x is some other number 
} 
+0

'colours'のいくつかは' colors'です;-) – vacawama

+0

@vacawama:オートコレクションを責めます:) –

+0

はい!オートコレクションも私のコメントを修正していました。しかし、ノア・ウェブスターには責任があるかもしれません。 :-) – vacawama

2

これは、coloursのような可変型のオプションタイプを作成したためです。あなたはこのように行う場合:

enum Optional<T> { 
    case Some(T) 
    case None 
} 

var colours: Colours 
colours = .Red 

あなたは私たちは、オプションの種類が何であるかを見れば、我々はこれが似列挙型であることがわかります。この値

をunwrappeする必要はありません

と入力してください。たとえば、Int、またはNoneのように入力します。この場合、値はゼロです。あなたはこの作るとき

var colours: Colours! 

をあなたが直接、これはColoursタイプではないことを!で示されるが、これはenum ImplicitlyUnwrappedOptional<Colours>タイプです。作成時にはSome<Colours>となりますが、これは!となりますが、それはenum ImplicitlyUnwrappedOptional<Colours>であり、次の瞬間ではNoneとなります。

あなたcolours値がImplicitlyUnwrappedOptional<Colours>タイプがあり、それがColoursまたはnilすることができ、直接これはswitch`` `でColoursタイプであることを示すために、あなたが持っている:あなたが!switchに使用しなければならない理由です。

+1

あなたは 'で変数を宣言することを示すいくつかのドキュメントを提供できる'それはオプションになります! ? – Arc676

+0

@ Arc676 i回答を編集 –

+1

'colors'のタイプは' ImplicitlyUnwrappedOptional 'で、' Optional 'ではありません。 –

1

の代わりに使用して:

var colours: Colours! 
colours = .Red 

を単にトリックを行う必要があります

var colours = Colours.Red 

を使用しています。

+1

しかし、私はオプションの色を変えたいと思います。それは '!'なしで動作するはずです。私の考えでは。 – Robert

+2

@roher enum型変数をオプションとして宣言することは、enumが明確な状態を持つように設計されているためあまり有用ではありません。オプションではなく、.'None'状態などを使用します。 – vadian

関連する問題