2016-11-20 2 views
0

この例では、Seasons列挙型で、イニシャライザは強制的に "!" 'self'のイニシャライザの最後に暗黙的にアンラップします。 「!」を削除した場合、エラーが発生します:「オプションのシーズンズの値はアンラップされていません」という意味ですか?「!」または「?」...スウィフトENUMS - なぜ私のenumイニシャライザで暗黙のうちにアンラップすると私に叫ぶのですか?それは私を強制する

最初に私はこれに何かがあると思いましたrawValueメソッドを使用して行うことができます。また、ユーザーが入力した値が実際の値ではない可能性があることをSwiftが十分に知っていれば、自動的にオプションにしました。ただし、私は一定の秋を作り、rawValueメソッドをもう一度使ったことがありますが、今度はエラーなく完全に動作しました。

私の質問は、このケースでは特に何ですか? 、私はSELFに割り当てていないときに、スウィフトは完全にオプションでなければそれは大丈夫ですか?

おかげで答えて

enum Seasons : String { 
    case fall 
    case winter 
    case spring 
    case summer 

    static var possibleCases : [Seasons] = [.fall, .winter, .spring, .summer] 

    init(_ val: String) { 
     self = Seasons(rawValue: val)! 
    } 
} 


let fall = Seasons(rawValue: "fall") 
+4

'fall'の型を見てみましょう。' Seasons? 'の型になります。オプションで '!'を使うことは暗黙のアンラップではなく、* explicit *です。 – Hamish

+5

'init?(rawValue:)'は利用可能なイニシャライザです。あなたは 'Seasons(rawValue:"⛄️ ")'に何を期待しますか? (コンパイラはそれを '.winter'に変換するほどスマートではありません:) –

+1

@MartinR Swift 4のための絵文字自然処理コンパイラが必要です。 – Alexander

答えて

0

感謝。私は、(rawValue :)メソッドを使って直接Enumを呼び出すことは、実際にはビルドインの初期化子であることを理解しました。これはinit(?)(initialValue:)イニシャライザがすでに各列挙型の内部にあるかのようですが、ビルドされていて、見ることができません。

私の質問では間違っていました。「fall」定数は実際はオプションです。

+2

Xcodeで 'let fall = Seasons(rawValue:" fall ")'の 'rawValue'をOption-クリックすると、イニシャライザの署名が表示されます。 – vacawama

+1

これは、 '' init?(rawValue:) 'を提供する[' RawRepresentable'](https://developer.apple.com/reference/swift/rawrepresentable)プロトコルです。生の値を持つ列挙型は暗黙的にそれに準拠しています。 – Hamish

+0

この回答があなたの質問を満たしている場合は、それを受け入れるように記入してください。 – Alexander

関連する問題