Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何在构造函数中初始化目标C结构?_Objective C_Constructor_Struct - Fatal编程技术网

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

Objective c 如何在构造函数中初始化目标C结构?,objective-c,constructor,struct,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; // D

我在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 } @接口:NSObject { //我的数据 结构数据 { __不安全的未修复的边界; __不安全的、未维护的BOOL isRegister; __不安全\u未恢复的NSString*myValue; //Data():isInit(false)、isRegister(false)、myValue(@“mYv4lue”){}//构造函数不工作 }; 结构数据myData;//创建结构 } 但是我不能用构造函数编译。我希望在创建结构时,这些值采用一些默认值


我该怎么做呢?

执行此操作的空间(在类的
@interface
块开头的大括号之间)不允许运行代码。它仅用于IVAR声明。您甚至不应该在其中声明
struct
s(我很惊讶编译)


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

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

比如说

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

您也可以这样做:

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

}

您可以使用静态对象作为默认设置,按如下方式初始化结构

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

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

Data myCopyOfDataInitialized = dataInit;

我很谨慎,在启动某些操作时,我需要正确初始化值,我不希望出现故障。有任何原因导致此结构无法转换为简单类吗?
\uuuu safe\u unrepaired
不适用于
BOOL
s-它们是基本体,而不是对象。您可能需要提到的是,此代码非常快速,不客观。目前,该示例不会在Objective-c中将“数据”作为局部变量提供给您。Pritesh Kadam的回答更加优雅和全面。公平地说,它是客观的C,因为Swift在2012年或2014年都不存在。这也不会编译成Swift,因为<代码>数据<代码>是一个在基础中定义的类型。@约瑟夫卡斯韦尔,当我说代码很快时,我猜是真的,至于Pritesh Kadam的回答:我不知道我在想什么,我发誓要修改我快速的调用方式。然而,我非常确定这段代码是无效的Objective-C和Abizern:“数据是在Foundation中定义的类型”?哪一个基金会?不是下一步。@ElisevanLooij
Data
是一种连接到
NSData
右侧的值类型。你看,这就是重点:如果你看一下链接页面的顶部,你会看到“语言:Swift”。这不是一个下拉列表,允许选择Objective-C,它与Swift相关。因此,在我的Xcode 9.2版(9C40b)安装中,从未使用Swift,数据是一种未知类型,会导致编译器错误“未知类型名称‘数据’”。设置ivar最好在初始化中完成,因为初始化保证在对象的生存期内只调用一次。您是说类方法
+initialize
,@ElisevanLooij?每个类调用一次,而不是每个实例。此外,您无法访问其中的实例变量,因为没有该类的实例。
-init
的返回类型是
id
instancetype
,而不是
void
。很好的忍者编辑。:/。。。我在第二段中建议使用
init
。那么我们在说什么呢?不幸的是,这段代码甚至不能用Objective-C编译。