2014-06-09 7 views
6

sto leggendo La Swift Programming Language, nella sezione valori semplicidichiarazioni let richiedono l'espressione di inizializzazione

“Use let to make a constant and var to make a variable. The value of a constant doesn’t need to be known at compile time, but you must assign it a value exactly once”

Quindi credo di poter fare questo

let aConstant:Int 
aConstant = 5 

ma ho dichiarazioni let richiede un'espressione di inizializzazione !!

Perché è quello? Cosa significano per "Il valore di una costante non ha bisogno di essere conosciuto in fase di compilazione"?

risposta

11

Dal Swift Language Reference:

When a constant is declared at global scope, it must be initialized with a value.

È possibile rimandare solo inizializzazione di un costante in classi/structs, dove puoi scegliere di inizializzarlo in t inizializzatore della classe/struct.

Il significato di "Il valore di una costante non deve essere noto al momento della compilazione" si riferisce al valore della costante. In C/Objective-C una costante globale deve essere assegnata a un valore che può essere calcolato dal compilatore (di solito un valore letterale come 10 o @"Hello"). Quanto segue non sarebbe stato consentito in Objective-C:

static const int foo = 10; // OK 
static const int bar = calculate_bar(); // Error: Initializer element is not a compile-time constant 

In Swift non si dispone di questa restrizione:

let foo = 10 // OK 
let bar = calculateBar(); // OK 

Edit:

La seguente dichiarazione nella risposta originale non è corretto:

L'unico posto dove Non è possibile eseguire il rinvio nello spazio globale (ad es. livello superiore let espressioni). Mentre è vero che è possibile rinviare l'inizializzazione in una classe/struttura, non è l'unico posto. Quello che segue è anche legale per esempio:

func foo() { 
    let bar: Int 
    bar = 1 
} 
1

la parola chiave let, per definizione, definisce constant.

Pertanto, non è possibile modificarlo una volta impostato.

Dato che è il caso, devono essere inizializzati quando vengono dichiarati!

La soluzione qui è quello di fare uno:

let aConstant = 5 

o cambiarlo in un var

var aNonConstant:Int 
aNonConstant = 5 
+0

come su "Il valore della una costante non ha bisogno di essere conosciuta in fase di compilazione "? – onmyway133

+1

No, non si può fare 'let aConstant = functionThatGeneratesARandomNumber()', ma è ancora una costante dopo quel punto e non è possibile riassegnarlo. – Jack

+1

Inoltre, le costanti in Swift non sono limitate a valori letterali come 'Int'. Puoi avere una costante che è un oggetto creato in fase di esecuzione. L'unica cosa che devi ricordare è che non può essere riassegnata dopo la sua definita (costante!) – Jack

2

Una costante non ha bisogno di essere conosciuto in fase di compilazione, ma deve avere un valore dopo l'inizializzazione: si

class MyClass: NSObject { 
    let aConstant: Integer; // no value 

    init() { 
     aConstant = 4; // must have a value before calling super 
     super.init(); 
    } 
} 

Questo permette di impostare la costante un valore dopo che è stato dichiarato e potenzialmente sconosciuto al momento della compilazione.

1

risposta per Swift 2:

È possibile scrivere le costanti come segue:

let aConstant:Int 
aConstant = 5 

Impostazione del tipo in questo modo vuol dire: "Questo sarà costante e avrà valore quando ne hai bisogno". Si noti che non è possibile utilizzare la costante prima di impostare il valore ad essa, c'è un errore di compilazione:

Constant 'aConstant' used before being initialized

Inoltre è possibile impostare il valore di aConstant solo una volta. Se si tenta di impostare il valore per la seconda volta, non c'è errore di compilazione tempo:

Immutable value 'aConstant' may only be initialized once

In ogni caso non si può fare questo per costanti globali, non c'è errore di compilazione tempo:

Global 'let' declaration requires an initializer expression