2017-12-27 5 views
0

条件によって異なる辞書を作成しようとしています。私がちょうど1つのバージョンの辞書を選ぶと、そのコードは正常に動作します。Swift:if文の中に作成された辞書を作成します。

しかし、「if else」ステートメント内で辞書を作成しようとすると、辞書が使われることはないという警告が表示され、コード内で「未解決の識別子datadictの使用」エラーが発生します。全く作成されていません。

私は素早くするのがとても簡単なので、シンプルなチャンスがありますが、私はそれを理解することができませんでした。

これは動作します:

let datadict: [String:Int] = [ 
"A":1, 
"B":2, 
"C":3, 
"D":4, 
"E":5] 

これは失敗します。

var dicttype = 1 //set the value to determine which dictionary to use 

if dicttype==1 { 
let datadict: [String:Int] = [ 
"A":1, 
"B":2, 
"C":3, 
"D":4, 
"E":5] 

} else { 

let datadict: [String:Int] = [ 
"A":3, 
"B":2, 
"C":9, 
"D":4, 
"E":15] 

} 

答えて

2

があなたの変数datadictは、それが宣言されたブロック(if/elseのブロック)にスコープされます。

それはそのブロックの範囲をより長生きさせるために、あなたがより高い範囲で宣言それに必要な、そして狭い範囲内にそれを定義します。

let datadict: [String: Int] 
if dicttype == 1 { 
    datadict = [ 
     "A": 1, 
     "B": 2, 
     "C": 3, 
     "D": 4, 
     "E": 5, 
    ] 
} else { 
    datadict = [ 
     "A": 3, 
     "B": 2, 
     "C": 9, 
     "D": 4, 
     "E": 15, 
    ] 
} 

きちんとしたものがスウィフトということですコンパイラはすべての変数が最初に使用される前にすべての可能なコードパスで初期化されることを保証します。

+0

うん、これはそれを解決します。 – user1162769

+0

これがあなたの質問を解決したら、それに投票してそれを受け入れるとマークしてください。 – Alexander

1

これはというスコープという概念です。これは、プログラミングのあらゆる形式で学び慣れていなければならないものです。 if/elseステートメントはスコープを定義します。if/elseステートメント内で作成する変数は、そのスコープ内でのみ使用できます。彼らは後で捨てる。関数内で作成する変数が、別の関数内で使用できないのと同じ理由です。この特定のケースで

は、あなたが範囲外変数を宣言し、はそれがスコープ内を初期化することができます

let dataDict: [String: Int] 
var dictType = 1 
if dictType == 1 { 
    dataDict = [ 
    ... 
    ] 
} 
else { 
    dataDict = [ 
    ... 
    ] 
} 
+1

私は見るので、 'if else'は機能のようなコンテナです。私のプログラミングのほとんどはRであり、それは間違いなくそこにある。ありがとうございました! – user1162769

関連する問題