2016-12-07 75 views
1

我是Swift的新手,所以這可能是一個noob問題,但如果有人清除了疑問,我將很感激,因爲我在網上找不到任何解釋。在使用for-in循環時,有時候這些變量之前沒有被初始化,並且仍然沒有編譯器錯誤。有時候,如果我嘗試寫VAR /他們面前讓,這表明無差錯「讓」的格局不能出現嵌套在一個已經不可改變的情況下在Swift中初始化變量沒有var/let

例如,在下面的代碼,爲什麼變量電影releasedDate沒有初始化之前?提前任何幫助:)

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之前沒有被初始化?」因爲這是語言的工作原理。您可能喜歡閱讀Apple提供的Swift電子書。 – dasdom

+0

你的代碼可以在我的遊樂場上正常工作。 –

回答

1

斯威夫特確實使用let初始化moviereleaseDate,而且簡化了初始化,這樣你可以認爲他們是從movies每一個設置爲正確的變量循環迭代的時間。這就是爲什麼你不需要在moviereleaseDate之前寫出讓步。

如果您在變量前寫入var,您可以改變它指向的數組中的值。如果它是一個讓,那麼它不會讓你改變它。

例如,如果你把VAR的變量之一的前面,這個代碼將改變所有的releaseDates 2000:

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

那麼是默認的初始化設置讓?因爲如果我對電影變量進行更改,它會提示我初始化爲var。我只是混淆了什麼時候使用var,什麼時候不使用。感謝您的關注。 –

+0

@AnuritaSrivastava更新了我的回答:) – Tometoyou

+0

我知道var用於非常量變量,因此當我在下一行聲明releaseDate時,您的代碼無錯誤地工作,但如果我不這樣,它就會顯示錯誤。爲什麼會發生? –

0

(movie, releaseDate)是變量的元組。 Swift允許使用元組一次初始化多個變量。

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

一個for-in循環是語法糖重新聲明這些常量爲您的集合中的每個元素。在這種情況下,let是隱含的。

還有其他的方式來獲得命名常數與隱let,就像使用封閉

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

上面的例子給出了相同的結果,你的代碼的方式。

但除了for-in,func參數和閉包之外,我想不出其他的情況,其中let/var關鍵字將在Swift 3.0中被省略。

+0

所以我只是混淆了什麼時候使用var和什麼時候不使用。像我們爲什麼這樣做?感謝您的關注。 –

+0

@AnuritaSrivastava幾乎總是使用var/let。在前面所描述的兩種情況下,我只能想到「遺漏」和「關閉」。此外,有時隱式變量/常量,如'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) 
    } 

你沒有說var,所以i自動與let聲明。這只是讓你的生活更簡單的一種方式。別擔心,快樂。

+0

我很抱歉,但我的問題是關於不使用任何這些,也顯示了一個錯誤,當我寫var。那麼,在'1 ... 3 {}'中寫'我在語法上是正確的嗎? –

+0

我知道它在編寫'var'時顯示錯誤。但是_I_告訴你如何編寫'var'並且不會得到一個錯誤。如果你不看和聽,你不會學習。 – matt