web-dev-qa-db-ja.com

アプリケーションのどこからでもアクセスできるグローバル変数を定義する方法は?

可能性のある複製:
グローバルint変数Objective C

グローバル変数を作成したいと思います。この変数にどこからでもアクセスしたい。

Java同等:

static var score:int = 0;

たとえば、Gameクラスにグローバル変数を定義した場合。このグローバル変数にアクセスする方法は?

Game.score ?
32
Benoît Freslon

アプリケーションに複数のビューがあり、その場合、すべてのビューにアクセスできる変数が必要な場合は、常にモデル/データクラスを作成し、変数を定義する必要があります。このようなもの :

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;    
}    

次に、View Controllerでこのメソッドを次のように呼び出す必要があります。

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

この変数は、すべてのView Controllerからアクセス可能です。 Dataクラスのインスタンスを作成するだけです。

Swift:

class DataClass {

    private var str: String!

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

使用法:DataClass.sharedManager.str

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!
    }
}  

使用法:DataClass.sharedManager.str

95
Nitish

Objective-Cでは、「クラス変数」を直接サポートしていません。代わりに、クラスのファイルのスコープに対して有効な変数を作成し、クラスメソッドを使用してアクセスできます。

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

IOSプロジェクトにグローバル変数を実装する好ましい方法(これらは真のグローバル変数ではありませんが)は、アプリケーションデリゲートでプロパティを作成し、各クラスからそのプロパティにアクセスするだけです。


編集:質問を読み直すと、質問を誤って解釈したように見えますが、おそらくughoavgfhwの答えが探しているものです。彼は正しい、Objective-Cにはクラス変数のようなものはないので、通常のC静的変数を作成してから、クラスメソッドを作成する必要があります(+ではなく-)設定および取得用。

一般に、アプリで「グローバル」変数が必要な場合は、シングルトンクラスを作成してそれらとその関連メソッドを格納します(したがって、アプリのデリゲートが関連のないプロパティでオーバーフローしない)、または小さなプロジェクトの場合はアプリケーションを使用します個別のシングルトンではなく、デリゲート(シングルトンクラスでもあります)。静的変数に加えて、クラスのセッター/ゲッターアプローチに問題がなければ、それが問題なく機能するのであれば問題はありません。

7
Ben Baron