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不允许运行代码。它仅用于 ivars 的声明。你真的不应该struct在那里声明 s (我很惊讶编译)。

将构造函数调用移至类的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 回答