2016-12-12 5 views
0

特定の条件に一致する既存の値がない場合、意図的に失敗するように設定された辞書があります。ディクショナリキーのスウィフト「let let ...」が失敗するとどうなりますか?

これ以外の場合、このコマンドは一度だけ動作します。私はこの権利をやっていると期待しています...失敗は何も起こらないことを意味します。 elseまたはその他の不測の事態コードは必要ありません。

これは正しいですか?

if let myTestKonstant = myDictionary[Int(store.itemID)]{ 
     // successful assignment code here 
     } 

// where I'm hoping a failure to assign falls through to... 
+5

はい、キーが辞書に見つからない場合、 'if'ステートメントのカッコ内のコードは単に実行されず、' if'ステートメントの後で再開します。 – Rob

+0

はい@Robが正しいです。これは、そのキーの値がdictに存在しない場合、クラッシュを防止します。 – PiyushRathi

+0

あなたの*キー*がオプションであると考えてください。 – vadian

答えて

1

オプションの暗黙的に開封されたそれは完全ではありません詳細を読むことができます問題は、intへの変換もオプションであることです。たとえば、これは(あなたがコンパイルエラーになるだろう、というか)クラッシュしていました:

let myDictionary = [3: "3"] 
let itemID = "b" 
if let myTestKonstant = myDictionary[Int(itemID)] { 
    print(myTestKonstant) 
} 

これが道を保存し、次のようになります。

if let itemKey = Int(itemID), let myTestKonstant = myDictionary[itemKey] { 
    print(myTestKonstant) 
} 

UPDATE

だからそれが明確です異なる場合に起こることを説明します。

  1. itemIDIntに変換できません:これはitemKeynilになることを意味します。したがって、2番目の部分はテストされず、ifの内容は実行されません。

  2. itemIDIntに変換することができますが、それは既存のキーではありません。この場合itemKeyIntitemIDに設定されますに変換されます。次に、2番目のステートメントがテストされますが、itemKeyは既存のキーとして見つからないため、myDictionary[itemKey]nilを返し、再びifの内容は実行されません。

  3. itemIDは、辞書のキーとして存在するIntに変換できます。前のケースと同様に、itemKeyが設定され、キーが見つかったので、nil[3: nil]のような)でない限り、myTestKonstantが埋められ、ifの内容が実行されます。

+0

'item 'が本当の' Int'であるのに対し、辞書の中のキーではないので、これは第2の '' let ...' 'が必要だと思います。 – Confused

+0

既存のキーでない場合、myTestKonstantはnilになり、その場合は入力されません – Daniel

+0

最初の 'if let ... 'は、それが本当のキーかどうかをチェックしません。整数。申し訳ありませんが、おそらく文脈が足りません。私のディクショナリでは、20未満の値はキーとなりません。また、10で割り切れない大きな数値もありません。また、itemIDの初期状態は20未満の値です。スイッチの並べ替えとして使用されます。 – Confused

1

オプションで暗黙的にラップを解除すると、その値が1つのステートメントでチェックされ、アンラップされます。ですから、そう

if let definiteString = assumedString { 
    print(definiteString) 
} 

をやって任意のエラー処理コード

を必要としないこと

if assumedString != nil { 
    print(assumedString) 
} 

と等価であるあなたは、here

+1

同値でdefiniteStringへの代入を忘れた – Daniel

+1

実際には同等ではありません。最初の例は '' myString "'のように表示され、2番目の例はまだアンラップされていないので 'Optional(" myString ")'が表示されます。 – Connor

関連する問題