2017-10-06 8 views
1

私は整数の配列に変換する必要がある文字列の配列を持っています。For Caseステートメントのオプション文

import Foundation 

let strings = ["One", "2", "Three", "4", "Five", "6"] 

let integers = strings.map{Int($0)} 

// :Using Optional Binding in a FOR Case Statement 
for case let val? in integers { 
    print("\(val)") 
} 

上記のFor Caseステートメントでは、[Int?]配列の任意の値とパターンマッチングを行っています。コンセプトについての私の理解は、配列はオプションのint配列なので、使用する前に戻り値をラップする必要がありますが、For Caseステートメントでオプションのバインディングを使用しているため、値が変数valにラップされません"しかし、変数 "val"自体はオプションの変数のように見えます。これは、print文で値を再度ラップ解除する必要がありますが、エラーになります: "非オプション型 'Int'のアンラップ値を強制できません。 "val"はオプションの変数ではありません。

これは本当に混乱しています。誰かが "?"を使用しているときに変数 "val"がオプションの変数ではない理由を説明できますか?それと !!

おかげで、 Ujj​​wal

答えて

2

val?は、 "オプションのパターン" と.some(val)ためのショートカットです。 式がnil, ではない場合は、任意の式に一致し、一致した式の値にvalにバインドします。 Optional Patternsから

:あなたが観察されるように

An optional pattern matches values wrapped in a some(Wrapped) case of an Optional<Wrapped> enumeration. Optional patterns consist of an identifier pattern followed immediately by a question mark and appear in the same places as enumeration case patterns.

したがってvalは、非オプションIntです。

0

for caseを使用している場合は、条件付きでコレクションを反復処理します。パターンと一致する要素のみを反復処理します。val?つまりoptionalと記述してください。

関連する問題