我在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时值会采用一些默认值。
我该怎么做?
答案 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;