2016-04-26 21 views
5

Dato questo Swift code di esempio:Accesso variabile globale a Swift

var a = 10; 

func foo() -> Int { 
    var a = 20; 
    return a; 
} 

Come può funzionare foo avere accesso a una variabile globale con valore 10 al posto del valore di un locale con 20?

Si noti che sia a che foo non sono dichiarati all'interno di una classe ma in un modulo generico. Sto cercando un modo per dire a Swift di accedere a una variabile globale definita al posto di quella localmente definita.

+0

var ae function foo non sono dichiarati all'interno di una classe ma in un modulo. – Marco

+1

Come si chiama il modulo? Penso che puoi farlo chiamando 'Module.a', ma non l'ho provato. https://www.reddit.com/r/swift/comments/3xd560/scoperesolution_operator/ –

+1

Inoltre, @Marco, è possibile modificare la domanda per includere le informazioni fornite nel commento? Penso che la maggior parte degli sviluppatori Swift supporrebbe che stiamo lavorando all'interno di una classe senza ulteriori informazioni. –

risposta

3

Ho creato un progetto in Xcode, un'applicazione console, l'obiettivo è qui un modulo. Così ho chiamato il progetto test e il target ha lo stesso nome così nel progetto il modulo stesso ha anche il nome test. Qualsiasi definizione globale implicherà una chiamata a test.. Proprio come le funzioni globali di Swift sono implicite una chiamata a Swift., come Swift.print("...").

var a = 10; 

func foo() -> Int { 
    let a = 20; 
    Swift.print(test.a) // same as print(test.a) 

    return a; 
} 

test.foo() // same as foo() 

output è:


Quindi, si deve aggiungere il nome del modulo prima della variabile per ottenere quella globale e non quello locale passare in secondo piano esso.

2

Utilizzare la parola chiave self:

func foo() -> Int { 
    var a = 20; 
    return self.a; 
} 
+0

foo non è un metodo definito in una classe, è una funzione, quindi self non è disponibile. – Marco

+0

Cosa succede se var a = 10; non è all'interno della stessa classe? Non riceverai alcun errore membro. –

2
func foo(bar:Any) -> Int { 
     let a = 20 
     if bar is Bar { 
      let c = bar as? Bar 
      return c!.a 
     } 
     return a 
    } 
+1

Si dovrebbe fare 'se lasciare c = bar come? Bar' invece di casting forzato. – EmilioPelaez