2016-08-29 8 views
0

私はプレイグラウンドでこれをやっていますが、何のエラーもありません。私は定数rangeを作り直していませんか? 2つの異なる範囲で起きていますか?背景に何が起きているのですか?に間違いがありますか?オプションは、if-letの結合が導入さ「オプションバインド」の再宣言でエラーが発生するのはなぜですか?

if let range = add1.rangeOfString(", ") { 
    print(add1.substringToIndex(range.startIndex)) 
    print (range) 
} 

if let range = add1.rangeOfString(", ") { 
    print(add1.substringToIndex(range.startIndex)) 
    print (range) 
} 
+0

*は結合条件は、キャストを適用したオプションをテストし、ローカル変数に開封された値をバインドすることができます*。 [here](http://www.informit.com/articles/article.aspx?p=2469047&seqNum=2) – Honey

答えて

2

変数の真の場合のコードブロックの終わりまでlet -clause後にローカルです。

だから、そうです。あなたの2つのrangeは、の2種類のスコープでに存在します。

guard-letは別のものです。)

+0

** 1)**このように作成された理由を説明できますか? Appleのマニュアルで何も見つかりませんでした。これの根底にあるメカニズムは何ですか? ** 2)**そして、接線の質問がします。 '{} 'の文は基本的に完了ハンドラですか? – Honey

+1

@Honey、1)if-letは、非nil検査と非nil(unwrapped)変数の宣言の組み合わせです。 '何かに似ているもの!= nil {let unwrappedSomething = something !;}}'と似ています。導入された変数は 'something!= nil'の文脈の中になければなりません。しかし、それは本当です、Appleのマニュアルには、Swiftの多くの重要な機能の詳細な説明がありません。 – OOPer

+1

@Honey、2) 'if'、 'while'、' do' ...でバインドされた '{}'表記を「コードブロック」と呼びます。いくつかの実行可能ステートメントをバンドルし、ローカル変数の新しいスコープも導入しています。 ''式 'の文脈における '{}'は、 "完了ハンドラ"と呼ばれる "クロージャ式"(または "クロージャリテラル"、多くは単に "クロージャ"と呼ばれます)と呼ばれます。 "Closure"は変数に格納してメソッドに渡すことができますが、 "コードブロック"は構文的なもので、if(または他のもの)から分離することはできません。 – OOPer

関連する問題