33 votes

Comment définir une variable globale à laquelle on peut accéder partout dans mon application ?

Duplicata possible :
Variable globale int objectif c

Je voudrais créer une variable globale. Je veux pouvoir 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 ?

0 votes

La réponse sur le lien suivant explique clairement stackoverflow.com/a/20423815/730807

97voto

Nitish Points 3918

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 ceci :

Objective-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 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

Utilisation de 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

0 votes

Cette ligne devrait-elle return instance; être à l'intérieur de la @synchronized bloc ?

1 votes

Comment obtenir ces variables dans une sous-classe de NSManagedObject dont on ne peut pas modifier la méthode init et qui n'a pas de viewDidLoad où les placer ?

2 votes

Dispatch_once() est la méthode préférée pour les singleton. stackoverflow.com/a/20423815/730807

20voto

ughoavgfhw Points 28400

Objective-C ne supporte pas directement les "variables de classe". A la place, vous pouvez créer une variable valable pour l'étendue du fichier de la classe et y accéder en utilisant les méthodes de la 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;
}

0 votes

Merci, cela m'a aidé à me débarrasser de l'avertissement. no static getter method named sharedInstance found return type default to id

0 votes

Simple et pourtant puissant

0 votes

Vous avez fait mon week-end :)

7voto

einsteinx2 Points 6624

La meilleure façon d'implémenter des variables globales dans un projet iOS (bien qu'il ne s'agisse pas de véritables variables globales) est de créer une propriété dans le délégué de l'application, puis d'accéder à cette propriété depuis chacune de vos classes.


EDITAR: 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 recherchez. Il a raison, il n'existe pas de variable de classe en Objective-C, vous devez donc créer une variable statique C normale, puis créer des méthodes de classe (désignées par le symbole + plutôt qu'un - ) pour le réglage et l'obtention.

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

0 votes

Comment accéder à cette propriété à partir d'autres classes ?

5 votes

Vous pouvez toujours obtenir une référence au délégué de l'application comme ceci : (YourAppDelegateClass *)[UIApplication sharedApplication].delegate . Je place une macro #define dans l'en-tête du délégué de l'application ou j'utilise une méthode de classe afin de pouvoir y accéder de manière plus propre, mais vous n'êtes pas obligé de le faire.

2 votes

De même, si vous vous retrouvez à mettre beaucoup de choses dans le délégué d'application, vous devriez probablement repenser votre approche, mais si c'est vraiment nécessaire, vous pouvez envisager de créer une classe singleton séparée pour cela, ou une classe ordinaire avec une référence dans votre délégué d'application.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X