Accesso variabile in diverse classi – Swift

ho due file veloci:

main.swift e view.swift

In main.swift ho una variable (Int) inizialmente impostata su 0 .

Con un IBACtion imposto che la variable sia 10 , e tutto è ok.

Tuttavia, se provo ad accedere a tale variable da view.swift , con una semplice chiamata come main().getValue() , ottengo sempre 0 e non 10 anche se la variabile ha cambiato il suo valore in main.swift.

Il metodo getValue() in main.swift ha il seguente aspetto:

 func getValue() -> Int { return variable } 

MODIFICARE

Ecco il codice (Tradotto dall’italiano: D)

 import Cocoa class Main: NSObject { var variable: Int = 0 func getValue() -> Int { return variable } @IBAction func updateVar(sender: AnyObject!) { variable = 10 } } 

 class View: NSView { override func drawRect(dirtyRect: NSRect) { println(Main().getValue()) //Returns always 0 } } 

Grazie in anticipo Alberto

C’è una distinzione importante da fare tra “file” in Swift e “classi”. I file non hanno nulla a che fare con le classi. Puoi definire 1000 classi in un file o 1 class in 1000 file (usando le estensioni). I dati vengono conservati in istanze di classi, non nei file stessi.

Quindi ora al problema. Chiamando Main() stai creando un’istanza completamente nuova della class Main che non ha nulla a che fare con l’istanza che hai collegato al tuo file Xib. Questo è il motivo per cui il valore risulta come predefinito.

Quello che devi fare è trovare un modo per ottenere un riferimento alla stessa istanza di quello sul tuo Xib. Senza conoscere più l’architettura della tua app, è difficile per me dare un suggerimento su come farlo.

Un pensiero è che puoi aggiungere un riferimento all’istanza Main nel tuo Xib usando un IBOutlet nella tua View . Quindi puoi semplicemente fare self.main.getValue() e verrà chiamato self.main.getValue() corretta.

Ho risolto questo problema creando una class principale generica accessibile a tutte le visualizzazioni. Crea un file swift vuoto, chiamalo “global.swift” e includilo nel tuo progetto:

global.swift:

 class Main { var name:String init(name:String) { self.name = name } } var mainInstance = Main(name:"My Global Class") 

Ora puoi accedere a questa mainInstance da tutti i tuoi controller di visualizzazione e il nome sarà sempre “My Global Class”. Esempio da una viewController:

viewController:

 override func viewDidLoad() { super.viewDidLoad() println("global class is " + mainInstance.name) }