2016-07-30 5 views
2

Variablen, die außerhalb des lokalen Geltungsbereichs deklariert wurden, sind im Bereich weiterhin verfügbar. Daher denke ich, wenn ich die Variable innerhalb des Gültigkeitsbereichs redeclare würde der Compiler mir einen Deklarationsfehler erzählen.Re-deklarieren Variable, Xcode sagt es vor der Initialisierung verwendet, warum nicht die Re-Deklaration Fehler?

Im folgenden Codeausschnitt wird die Konstante tipPercentage außerhalb des, wenn Gültigkeitsbereich deklariert und innerhalb des

let totallBill = 95.00 
let tipPercentage: Double 
let rating = 3 

if rating == 5 { 
    tipPercentage = 0.25 
} else if rating >= 3 { 
    tipPercentage = 0.15 
} else { 
    let tipPercentage = 0.10 //# error caused by the let 
} 

let totalPaid = totallBill + totallBill * tipPercentage 

Problem

I neu deklariert die Konstante in dem, wenn Umfang, wenn Umfang eingestellt. Ich dachte, es wird eine redeclare variablen Fehler erzählen, aber stattdessen gab es die "constant "tipPercentage" used before being initialized." Warum ist das?

enter image description here

Vielen Dank

Antwort

6

Es gibt zwei Fragen gibt:

  1. Warum Sie etwas „neu deklarieren“ Fehler nicht bekommen?

    Dies liegt daran, dass Sie nur Fehler bei der erneuten Deklaration erhalten, wenn Sie eine Variable im selben Bereich erneut deklarieren. Aber Ihre else Klausel ist ein engerer Bereich, so dass die let tipPercentage eine andere Konstante definiert, deren Name zufälligerweise die gleiche ist wie die ursprüngliche tipPercentage, deren Umfang jedoch innerhalb dieser else Klausel begrenzt ist.

    Ich hätte jedoch eine weitere Warnung erwartet, dass diese neue eng begrenzte tipPercentage Konstante wurde deklariert, aber nie verwendet.

  2. Warum haben Sie den Fehler "constant 'tipPercentage' vor der Initialisierung" erhalten?

    Sie haben dies, weil diese dritte Klausel (die endgültige else Klausel) eine neue lokale Konstante zufällig tipPercentage genannt definiert, aber die ursprüngliche tipPercentage wird in diesem dritten Pfad nicht berührt. Die Warnung sagt Ihnen also, dass in den obigen if - else Anweisungen ein Pfad der Ausführung vorhanden ist, der das ursprüngliche tipPercentage nicht festgelegt hat.


Um zu klären, Ihr Code-Snippet entspricht:

let totallBill = 95.00 
let tipPercentage: Double 
let rating = 3 

if rating == 5 { 
    tipPercentage = 0.25 
} else if rating >= 3 { 
    tipPercentage = 0.15 
} else { 
    let foo = 0.10 // this was coincidentally called `tipPercentage`, but since this is yet another a local constant of even narrower scope, it's equivalent to using a completely different name 
} 

let totalPaid = totallBill + totallBill * tipPercentage 
+0

Vielen Dank für Ihre Hilfe und Erklärung – SLN

4

Re-Vereinbarungs die Konstante in dem inneren Umfang ist kein Fehler. Alles, was es tut, ist, die Konstante vor dem äußeren Geltungsbereich zu verbergen, was völlig legal ist.

Das Problem passiert, weil es einen Code-Pfad gibt, nämlich den durch den else mit einer Re-Deklaration, die äußere Konstante nicht initialisiert bleibt. Das ist der Fehler, den der Compiler meldet.

+0

Vielen Dank für Ihre Erklärung „sehr viel) – SLN

Verwandte Themen