2016-12-07 11 views
1

私はSwiftの新機能ですので、これはノーブの質問になるかもしれませんが、誰かが疑問を解決した場合、私はオンラインで説明を見つけることができません。 for-inループを使用している間に、変数が初期化されていないことがありますが、コンパイラエラーはありません。私は彼らの前に聞かせては/ varを書くしようと場合によっては、パターンは以下のコードは、なぜ変数ムービーとreleasedDateがされていない中で、例えば、すでに不変のコンテキストでswiftで変数を初期化せずにvar/let

を入れ子に表示することはできません「聞かせて」エラー - を示し前に初期化された?任意の助けを事前に

class MovieArchive { 
func filterByYear(year:Int, movies:Dictionary<String, Int>) -> [String]{ 
    var filteredArray = [String]() 
    for (movie, releaseDate) in movies { 
     if year == releaseDate { 
      filteredArray.append(movie) 
     } 
    } 
    return filteredArray 
} 

} 

var aiThemedMovies = ["Metropolis": 1927, "2001: A Space Odyssey": 1968, "Blade Runner": 1982, "War Games": 1983, "Terminator": 1984, "The Matrix": 1999, "A.I.": 2001, "Her": 2013, "Ex Machina": 2015] 

var myArchive = MovieArchive() 
myArchive.filterByYear(year: 2013 
, movies: aiThemedMovies) 

感謝:)

+0

説明したエラーメッセージが表示される例を示してください。 –

+3

"たとえば、以下のコードで、なぜ変数movieおよびreleasedDateが以前に初期化されていないのですか?これは言語がどのように機能するかということです。アップルが提供するスウィフト電子ブックを読んでお楽しみください。 – dasdom

+0

あなたのコードは私のプレイグラウンドで正常に動作します。 –

答えて

1

スウィフトはletを使用してmoviereleaseDateを初期化しますが、あなただけの彼らはすべてのmoviesから正しい変数に設定していると仮定することができるようにその初期化を簡素化ループが反復する時間。だから、moviereleaseDateの前にletを書く必要はありません。

変数の前にvarを書き込むと、その変数が指している配列の値を変更することができます。それはletの場合、それはあなたがそれを変異させることはありません。例えば

あなたは変数の1の前にVARを配置する場合、このコードは、2000年にすべてのreleaseDatesを変更します:

class MovieArchive { 
    func filterByYear(year:Int, movies:Dictionary<String, Int>) -> [String]{ 
     var filteredArray = [String]() 
     for (movie, var releaseDate) in movies { 
      releaseDate = 2000 
      if year == releaseDate { 
       filteredArray.append(movie) 
      } 
     } 
     return filteredArray 
    } 
} 
+0

デフォルトの初期化はletに設定されていますか?なぜなら私がムービー変数を変更すると、varとして初期化するように促すからです。私はちょうどときにvarを使用すると混同していないとき。懸念していただきありがとうございます。 –

+0

@AnuritaSrivastava私の答えを更新しました:) – Tometoyou

+0

varは定数ではない変数に使用されているので、次の行でreleaseDateを宣言するとエラーなしでコードが動作することがわかりますが、そうでなければエラーが表示されます。なぜそれが起こるのですか? –

0

(movie, releaseDate)は、変数のタプルです。 Swiftでは、タプルを使用して一度に複数の変数を初期化できます。

let (movie, releaseDate) = ("Metropolis", 1927) 

for-inループは、あなたのコレクションの各要素のためにこれらの定数を再宣言するためのシンタックスシュガーです。この場合、letが暗黙的です。

class MovieArchive { 
    func filterByYear(year: Int, movies: [String: Int]) -> [String] { 
     return movies.filter { (movie, releaseDate) -> Bool in 
      year == releaseDate 
      }.map { $0.key } 
    } 
} 

上記の例では、方法によって、あなたのコードと同じ結果が得られます。

閉鎖を使用してのように、暗黙のletで名前付き定数を取得するための他の方法があります。

しかし、for-in、funcパラメータとクロージャから離れて、let/varキーワードがSwift 3.0で省略されている他のケースは考えられません。

+0

だから私はちょうどときにvarを使用すると混乱しています。なぜ我々はこれを行うのですか?懸念していただきありがとうございます。 –

+0

@AnuritaSrivastavaは、ほとんど常にvar/letを使用します。私は前に説明した「for-in」と閉鎖の2つのケースでは、省略について考えることができます。また、 'self'、' $ 0'、 'error'(' do-catch'のような)のような暗黙的な変数/定数があります。 –

+0

洞察力ありがとう! :) –

1

実用的には自分自身については言及していませんが、forのループで構文的に合法的なものについて話しましょう。これは合法です:

for var i in 1...3 { // ok 
     print(i) 
     i = 0 
    } 

これは法的ではありません。

for let i in 1...3 { // error 
     print(i) 
    } 

なぜ?あなたがこれを言うときlet暗黙のですので:

for i in 1...3 { // ok 
     print(i) 
    } 

あなたはそうiが自動的letで宣言され、varを言いませんでした。それはあなたの人生をよりシンプルにする単なる方法です。くよくよせずに楽しくやろうぜ。

+0

申し訳ありませんが、私の質問は、これらのいずれかを使用していないことについても、私はvarを書くときにエラーを示しています。ですから、 'for i in 1 .... 3 {}'と書くのは構文上正しいですか? –

+0

'var'と書くとエラーが表示されることは知っています。しかし、_I_は 'var'を書く方法を示し、_not_はエラーになりません。あなたが見て聞いていないなら、あなたは学ばないでしょう。 – matt

関連する問題