2016-04-28 14 views
-2

次のコードを試したところ、エラーが発生しました。nilオブジェクトコンパイラが "未解決の識別子"と表示されました。何が起こったのですか?

var possibleNumber = "Hello World!" 

if let actualNumber: Int = Int(possibleNumber) { 
    print("\"\(possibleNumber)\" has an integer value of \(actualNumber)") 
} else { 
    print("\"\(possibleNumber)\" could not be converted to an integer") 
} 

print(actualNumber) // **Here comes the compile time error** 

エラー:

use of unresolved identifier 'actualNumber' 

オブジェクトactualNumber背後に何が起こっていますか?私はオプションのバインディングの最初の部分でそれを宣言しました: "もしlet actualNumber:Int ....."なら、それはなぜ "未解決"ですか?うーん... "解決されていない"それは正確に何ですか?

私は何とか間違って印刷されていると思いますが、それはなぜ間違っていますか?知りません。誰かがこれをもう少し説明できますか?そしてBTWはactualNumberの中に実際には何もないのですか?もしそうなら、どうすればそれを見ることができますか?

+2

'actualNumber'は' if'のスコープ内で別名で定義されたスコープ内にのみ存在します。単に存在しない場合は、そのスコープ内に定義された関連する変数がないため、コンパイラは名前を解決できません。 – luk2302

+0

@ luk2302今、私は他の部分の本文をprint(actualNumber)に変更しましたが、まだ "解決されていません...."と言われています。それはまだ "if"の範囲外です。 – SLN

+3

私はあなたがサンプルコード[オプションのバインディングのドキュメントから](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/TheBasics.html#//apple_ref/doc/uid/TP40014097-CH5- ID333)。あなたが少し読書を続けているなら、あなたは "* if文の中でのみ使用可能な*定数と変数は、if文の中でのみ利用可能です。ガード・ステートメントを使用して、ステートメントの有効範囲外のオプションのバインドされた変数を使用することができます。 – Hamish

答えて

1

ような何かを行うことができます条件付きでVAを宣言するif文の中でriableを使用し、if文の外側でそれを使用したいとします。これは動作しません。まず、条件付き連鎖を使用します。ここでは、actualNumberは、possibleNumberがnilではないことが初期化されます。 possibleNumberがnilの場合、actualNumberは存在しません。

第2に、ifステートメント内で宣言された定数(または変数)は、そのifステートメント内のスコープのみを持ちます。これは、最後のif文で行っている定数にアクセスしようとすると、コンパイラは定数が存在しないことを宣言します。

オプションのチェーンはappleのthis siteで説明されています。

+0

"possibleNumberがnilの場合、actualNumberは存在しません"というのは、possibleNumberがnilであり、acturalNumberがdeclearedされていないことを意味します.acturalNumberを無効にするための前提条件はInt(possibleNumber) – SLN

+0

正しい。答えにリンゴが説明したオプションの連鎖へのリンクを追加しました。 – MacUserT

+0

ありがとうございました。あなたの助けからの良い学習:) – SLN

1
you should do something like this : 

if let actualNumber = Int(possibleNumber) { 
// do something with your number 
print("\"\(possibleNumber)\" has an integer value of \(actualNumber)") 
} else { 
print("\"\(possibleNumber)\" could not be converted to an integer") 
} 

//それがnilまたはオプションのいずれかの値を返します

とのInt( "DD")場合は、外部のactualNumberにアクセスすることはできません。

+0

はい、あなたは正しいです、今私はあなたの助けからスコープが意味するものを知り始めました、ありがとうございました – SLN

1

もし範囲:

if let actualNumber = Int(possibleNumber) { 
    // Here the 'actualNumber' can be accessed because is in scope 
} else { 
    // Here the 'actualNumber' cannot be accessed because is not in scope 
} 

ガード範囲

guard let actualNumber = Int(possibleNumber) else { 
    // actualNumber cannot be accessed 
    // print(actualNumber) 
    return 
} 

// actualNumber can be accessed 
print(actualNumber) 

しかし、あなたは、オプションの値をしたい場合、あなたはあなたがいるこの

let possibleNumber = "Hello World!" 
// actualNumber will be optional (and in this case will be 'nil') 
let actualNumber = Int(possibleNumber) 

print(actualNumber) 
+0

ありがとう、今私はガードスコープが何を意味するかを知り始めました。 – SLN

関連する問題