Как инициализировать конструктор Objective C в конструкторе?

Я использую структуру 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.

Как я могу это сделать?

Ответ 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, что плохо работает с структурами, в которых есть указатели объектов. Рекомендация в этом случае - просто использовать класс вместо структуры.

Ответ 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;

}

Ответ 3

Пространство, в котором вы делаете это - между фигурными фигурными скобками в начале блока @interface - не позволяет запускать код. Это исключительно для деклараций иваров. Вы действительно даже не должны объявлять struct там (я удивлен, что компилируется).

Переместите вызов конструктора методу класса init. То, где предполагается инициализация иваров в ObjC.

Ответ 4

Вы можете инициализировать структуру следующим образом, используя статический объект для настроек по умолчанию.

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

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

Data myCopyOfDataInitialized = dataInit;