web-dev-qa-db-fra.com

Comment définir une variable globale accessible partout dans mon application?

Duplicata possible:
Variable globale int Objectif C

Je voudrais créer une variable globale. Je veux accéder à cette variable n'importe où.

L'équivalent Java:

static var score:int = 0;

Par exemple, si je définis une variable globale dans la classe Game. Comment accéder à cette variable globale?

Game.score ?
32
Benoît Freslon

Si vous avez plusieurs vues dans votre application, et dans ce cas, vous voulez avoir une variable accessible à chaque vue, vous devez toujours créer une classe Model/Data et y définir la variable. Quelque chose comme ça :

Objectif-C:

//DataClass.h      
@interface DataClass : NSObject {    

    NSString *str;
}

@property(nonatomic,retain)NSString *str;    
+(DataClass*)getInstance;    
@end  


//DataClass.m    
@implementation DataClass    
@synthesize str;

static DataClass *instance = nil;

+(DataClass *)getInstance
{    
    @synchronized(self)    
    {    
        if(instance==nil)    
        {    
            instance= [DataClass new];    
        }    
    }    
    return instance;    
}    

Maintenant, dans votre contrôleur de vue, vous devez appeler cette méthode comme:

DataClass *obj=[DataClass getInstance];  
obj.str= @"I am Global variable";  

Cette variable sera accessible à chaque contrôleur de vue. Il vous suffit de créer une instance de la classe Data.

Swift:

class DataClass {

    private var str: String!

    class var sharedManager: DataClass {
        struct Static {
            static let instance = DataClass()
        }
        return Static.instance
    }
}

Utilisation: DataClass.sharedManager.str

En utilisant dispatch_once

class DataClass {

    private var str: String!

    class var sharedInstance: DataClass {
        struct Static {
            static var onceToken: dispatch_once_t = 0
            static var instance: DataClass? = nil
        }
        dispatch_once(&Static.onceToken) {
            Static.instance = DataClass()
        }
        return Static.instance!
    }
}  

Utilisation: DataClass.sharedManager.str

95
Nitish

Objective-C ne prend pas directement en charge les "variables de classe". Au lieu de cela, vous pouvez créer une variable qui est valide pour la portée du fichier de la classe et y accéder à l'aide des méthodes de classe.

// outside the implementation
static int score = 0; // static means it is only accessible from the current file

@implementation Game

+ (int)score {
    return score;
}
+ (void)setScore:(int)newScore {
    score = newScore;
}
20
ughoavgfhw

La meilleure façon d'implémenter des variables globales dans un projet iOS (bien que ce ne soient pas de vraies variables globales) est de créer une propriété dans le délégué d'application, puis d'accéder simplement à cette propriété à partir de chacune de vos classes.


EDIT: En relisant votre question, il semble que j'ai mal interprété votre question, et la réponse de ughoavgfhw est probablement ce que vous cherchez. Il a raison, il n'y a pas de variable de classe dans Objective-C, donc vous devez créer une variable statique C régulière, puis créer des méthodes de classe (désignées par le + Plutôt qu'un -) pour définir et obtenir.

Bien que généralement, lorsque j'ai besoin de variables "globales" dans une application, je crée des classes singleton pour les héberger et leurs méthodes associées (afin que le délégué de l'application ne déborde pas de propriétés non liées), ou si c'est un projet plus petit, j'utilise simplement l'application délégué (qui est également une classe singleton) plutôt que des singletons séparés. Bien qu'il n'y ait rien de mal à l'approche variable variable plus setter/getter de classe si cela fonctionne mieux pour vos besoins.

7
Ben Baron