如何在构造函数中初始化Objective C结构?

时间:2012-09-17 07:33:49

标签: objective-c constructor struct

我在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

}

但我无法使用构造函数进行编译。我希望在创建Struct时值会采用一些默认值。

我该怎么做?

4 个答案:

答案 0 :(得分:20)

结构没有初始化器,如果你想创建一个带有一组特定值的结构,你可以编写一个返回创建并初始化它的函数:

例如

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,它对于在其中包含对象指针的结构不能很好地工作。在这种情况下,建议只使用类而不是结构。

答案 1 :(得分:4)

您也可以这样做:

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

}

答案 2 :(得分:3)

您正在执行此操作的空间 - 在类@interface块开头的花括号之间 - 不允许运行代码。它仅用于宣告伊萨克斯。你真的不应该在那里声明struct(我很惊讶编译)。

将构造函数调用移动到类的init方法。这就是在ObjC中发生ivars初始化的地方。

答案 3 :(得分:3)

您可以使用静态对象为默认设置初始化结构。

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

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

Data myCopyOfDataInitialized = dataInit;