2016-12-07 2 views
1

Ich bin neu bei Swift, also könnte das als eine Frage kommen, aber ich werde dankbar sein, wenn jemand den Zweifel beseitigt hat, weil ich online keine Erklärung finden kann. Bei der Verwendung der for-in-Schleife wurden die Variablen manchmal noch nicht initialisiert, und es liegt immer noch kein Compilerfehler vor. Manchmal, wenn ich versuche, var schreiben/lassen, bevor sie, zeigt sie fehler- ‚lassen‘ Muster nicht in einem bereits unveränderlichen Kontext verschachtelt erscheinen könnenVariablen initialisieren in Swift ohne var/let

zB in dem folgenden Code, warum haben die Variablen Film und releasedDate nicht gewesen zuvor initialisiert?

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) 

Vielen Dank im Voraus für jede Hilfe :)

+0

Bitte zeigen Sie ein Beispiel, in dem die von Ihnen beschriebene Fehlermeldung angezeigt wird. –

+3

"Warum werden beispielsweise im folgenden Code die Variablen Movie und releasedDate nicht vorher initialisiert?" Weil so die Sprache funktioniert. Viel Spaß beim Lesen des Swift-eBooks von Apple. – dasdom

+0

Ihr Code funktioniert gut auf meinem Spielplatz. –

Antwort

1

Swift tut movie und releaseDate initialisieren let verwenden, aber vereinfacht, dass die Initialisierung, so dass Sie einfach davon ausgehen können, dass sie auf die richtigen Variablen aus movies gesetzt sind alle Zeit, die die Schleife iteriert. Deshalb müssen Sie nicht vor movie und releaseDate schreiben lassen.

Wenn Sie var vor die Variable schreiben, können Sie den Wert in dem Array mutieren, auf das er zeigt. Wenn es ein Let ist, dann lässt es dich nicht mutieren.

Zum Beispiel, wenn Sie var vor eine der Variablen platzieren, wird dieser Code die alle releaseDates ändern bis 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

Also ist die Standard-Initialisierung eingestellt? Denn wenn ich Änderungen an der Filmvariable vornehme, fordert es mich auf, als Var zu initialisieren. Ich bin nur verwirrt, wann var zu verwenden ist und wann nicht. Danke für die Sorge. –

+0

@AnuritaSrivastava Aktualisiert meine Antwort :) – Tometoyou

+0

Ich bin mir bewusst, dass Var für nicht konstante Variablen verwendet wird, und so funktioniert Ihr Code ohne Fehler, wenn ich ReleaseDate in der nächsten Zeile deklarieren, aber wenn ich nicht dann zeigt es Fehler. Warum passiert das? –

0

(movie, releaseDate) ein Tupel von Variablen ist. Swift ermöglicht die Initialisierung mehrerer Variablen gleichzeitig mit Tupeln.

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

A for-in Schleife ist syntaktischer Zucker diese Konstanten für jedes Element der Sammler neu deklarieren. In diesem Fall ist let implizit.

Es gibt auch andere Möglichkeiten, um benannte Konstanten mit impliziten let zu erhalten, wie mit einem Verschluss:

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

Das obige Beispiel durch die Art und Weise die gleichen Ergebnisse wie Ihr Code gibt.

Aber abgesehen von for-in, func Parameter und Verschlüsse, kann ich nicht an andere Fälle denken, wo das let/var Schlüsselwort in Swift 3.0 weggelassen würde.

+0

So bin ich nur verwirrt, wann var zu verwenden und wann nicht. Warum machen wir das? Danke für die Sorge. –

+0

@AnuritaSrivastava verwenden fast immer var/let. Ich kann nur an Unterlassung in den beiden zuvor beschriebenen Fällen denken, "For-in" und "closures". Außerdem gibt es manchmal implizite Variablen/Konstanten, wie 'self',' $ 0', 'error' (in einem' do-catch') –

+0

Vielen Dank für den Einblick! :) –

1

Ohne uns mit der praktischen Verwendung zu beschäftigen, lassen Sie uns nur darüber sprechen, was in einer for Schleife syntaktisch legal ist. Das ist legal:

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

Dies ist nicht legal:

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

Warum? Da die letimplizite ist, wenn Sie sagen:

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

Du hast nicht var sagen, so i automatisch mit let deklariert wird. Es ist nur eine Möglichkeit, dein Leben einfacher zu machen.Mach dir keine Sorgen, sei glücklich.

+0

Es tut mir leid, aber meine Frage ist nicht zu verwenden, und es zeigt auch einen Fehler, wenn ich var schreibe. Ist es also syntaktisch richtig, 'für i in 1 .... 3 {}' zu schreiben? –

+0

Ich weiß, es zeigt einen Fehler, wenn Sie 'var' schreiben. Aber _I_ zeigte Ihnen, wie man 'var' schreibt und _not_ einen Fehler erhält. Du wirst nicht lernen, wenn du nicht hinschaust und zuhörst. – matt

Verwandte Themen