12

次のようなデータを格納するために、Objective-C で構造体を使用しています。

@interface Interface : NSObject
{
    // my Data
    struct Data
    {
        __unsafe_unretained BOOL isInit;
        __unsafe_unretained BOOL isRegister;
        __unsafe_unretained NSString* myValue;
        
       // Data() : isInit(false), isRegister(false), myValue(@"mYv4lue") {} // Constructor doesnt work
    };

    struct Data myData;  // Create Struct
}

しかし、コンストラクターでコンパイルできません。構造体を作成するときに、値にデフォルト値を設定したいと思います。

これどうやってするの?

4

4 に答える 4

24

構造体には初期化子がありません。特定の値のセットを使用して構造体を作成する場合は、作成を返し、それを初期化する関数を作成できます。

例えば

struct Data {
        BOOL isInit;
        BOOL isRegister;
        NSString* myValue;
};

Data MakeInitialData () {
    data Data;
    data.isInit = NO;
    data.isRegister = NO;
    data.myValue = @"mYv4lue";

    return data;
}

これで、次のように正しく設定された構造体を取得できます。

Data newData = MakeInitialData();

ただし、注意してください。ARCを使用しているようですが、オブジェクトポインタを含む構造体ではうまく機能しません。この場合の推奨事項は、構造体の代わりにクラスを使用することです。

于 2012-09-17T07:43:57.260 に答える
6

デフォルト設定の静的オブジェクトを使用して、次のように構造体を初期化できます。

typedef struct
{
    BOOL isInit;
    BOOL isRegister;
    __unsafe_unretained NSString* myValue;

} Data;
static Data dataInit = { .isInit = NO, .isRegister = NO, .myValue = @"mYv4lue"};

Data myCopyOfDataInitialized = dataInit;
于 2016-09-21T19:36:29.290 に答える
3

これを行っているスペース(クラスのブロックの先頭にある中括弧の間)では、@interfaceコードを実行できません。これは、ivarの宣言専用です。あなたは本当にそこにsを宣言するべきではありませんstruct(私はそれがコンパイルされることに驚いています)。

コンストラクター呼び出しをクラスのinitメソッドに移動します。ここで、Ivarsの初期化がObjCで行われることになっています。

于 2012-09-17T07:43:44.897 に答える
3

次の方法でも実行できます。

@interface Interface : NSObject
{

   typedef struct tagData

    {
        __unsafe_unretained BOOL isInit;
        __unsafe_unretained BOOL isRegister;
        __unsafe_unretained NSString* myValue;

        tagData(){
           isInit = NO;
           isRegister = NO;
           myValue = NULL;
        }
    } myData;

}
于 2014-04-24T06:36:36.103 に答える