web-dev-qa-db-fra.com

Variable d'accès dans une classe différente - Swift

j'ai deux Swift:

main.Swift Et view.Swift

Dans main.Swift j'ai une variable (Int) initialement réglée sur 0.

Avec un IBACtion j'ai défini ce variable sur 10, Et tout va bien.

Cependant, si j'essaye d'accéder à ce variable à partir de view.Swift, avec un simple appel comme main().getValue(), j'obtiens toujours 0 Et non 10 Même si la variable a changé sa valeur dans main.Swift.

La méthode getValue() in main.Swift ressemble à ceci:

func getValue() -> Int {
return variable
}

MODIFIER

Voici le code (Traduit de l'italien: 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
    }
}

Merci d'avance Alberto

21
Alberto Bellini

Il y a une distinction importante à faire entre "fichiers" dans Swift et "classes". Les fichiers n'ont rien à voir avec les classes. Vous pouvez définir 1000 classes dans un fichier ou 1 classe dans 1000 fichiers (en utilisant des extensions) Les données sont conservées dans instances des classes, pas dans les fichiers eux-mêmes.

Alors maintenant, le problème. En appelant Main() vous créez une toute nouvelle instance de la classe Main qui n'a rien à voir avec l'instance que vous avez connectée à votre fichier Xib. C'est pourquoi la valeur sort par défaut.

Ce que vous devez faire, c'est trouver un moyen d'obtenir une référence à l'instance même que celle de votre Xib. Sans en savoir plus sur l'architecture de votre application, il m'est difficile de faire une suggestion pour ce faire.

Une pensée est que vous pouvez ajouter une référence à votre instance Main dans votre Xib en utilisant un IBOutlet dans votre View. Ensuite, vous pouvez simplement faire self.main.getValue() et il sera appelé sur l'instance correcte.

17
drewag

J'ai résolu ce problème en créant une classe principale générique accessible à toutes les vues. Créez un fichier Swift Swift, nommez-le 'global.Swift' et incluez-le dans votre projet:

global.Swift:

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

Vous pouvez désormais accéder à cette instance principale à partir de tous vos contrôleurs de vue et le nom sera toujours "Ma classe globale". Exemple d'un viewController:

viewController:

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