如何初始化在构造函数中的目标的C结构?(How to initialize an Objective

2019-07-31 15:47发布

I'm使用的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

}

但我不能用一个构造函数编译。 我想,当我创建该结构的值需要一些默认值。

我怎样才能做到这一点?

Answer 1:

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

例如

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,不与那些在他们的对象指针结构很好地工作。 在这种情况下,建议是只使用,而不是一个结构的类。



Answer 2:

你也可以做到这一点的方法:

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

}


Answer 3:

在类年代初花括号之间-在你这样做的空间@interface块-不允许运行的代码。 它是专为高德的声明。 你真的不应该甚至宣称struct中有S(我很惊讶,编译)。

移动构造函数调用到您的类的init方法。 这就是高德的初始化应该在ObjC发生。



Answer 4:

你可以使用静态对象的默认设置如下初始化一个结构。

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

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

Data myCopyOfDataInitialized = dataInit;


文章来源: How to initialize an Objective C struct in constructor?