Arrays 如何初始化空结构?

Arrays 如何初始化空结构?,arrays,swift,struct,Arrays,Swift,Struct,我不知道如何初始化下面的结构?基本上,我想创建一个表示下面结构的空变量,但值应该是可选的/nil,但我不知道如何执行 // MARK: - Main struct Main: Codable { let meta: Meta let objects: [Object] } // MARK: - Meta struct Meta: Codable { let status: String let count, offset, totalcount: Int }

我不知道如何初始化下面的结构?基本上,我想创建一个表示下面结构的空变量,但值应该是可选的/nil,但我不知道如何执行

// MARK: - Main
struct Main: Codable {
    let meta: Meta
    let objects: [Object]
}

// MARK: - Meta
struct Meta: Codable {
    let status: String
    let count, offset, totalcount: Int
}

// MARK: - Object
struct Object: Codable {
    let id:Int
    let url: String
    let displayname: String
    let inventory: [Inventory]
    let media: [Media]
}


// MARK: - Inventory
struct Inventory: Codable {
   let id, warehouseid, instock, threshold: Int
    let reserved: Int
    let coordinates, note: String
    let prodno: Int
    let lastinventory: String
    let soldout, onpurchaseorders, generation: Int
    let created, changed: String
}

// MARK: - Media
struct Media: Codable {
    let id, prodno: Int
    let webpath: String
    let slot: Int
    let type, extdata: String
    let ctime, xsize, ysize, mediasetid: Int
    let alt, title: String
    let generation: Int
    let created, changed: String
}
使用下面的代码,我在调用initializer时会收到错误消息no-exact matches,如果我更改代码,还会收到一系列其他错误

var sökresultat3 = Main3()

如果希望属性是可选的,那么必须以这种方式声明它们。Int表示需要Int。如果需要可选的Int,请声明它Int

也就是说,我会非常仔细地考虑创建这么多可选的数组和字符串,尤其是可选的数组和字符串。在您的系统中,无库存为零和库存为空[]之间是否存在差异?或者没有名字零和空名字?如果这些值是相同的,那么您通常只希望使用默认值,而不是可选值。选项增加了很多您可能不需要的复杂性

作为默认值的一个示例,使用var将使这一过程变得更加简单,并为您提供您希望的初始值设定项:

struct Main: Codable {
    var meta = Meta()
    var objects: [Object] = []
}

// MARK: - Meta
struct Meta: Codable {
    var status = ""
    var count = 0
    var offset = 0
    var totalcount = 0
}
如果您将这些设置为可选,那么var将再次创建您要查找的初始值设定项:

struct Main: Codable {
    var meta: Meta?
    var objects: [Object]?
}
通常,没有逻辑的简单数据结构应该声明它们的属性var。有一些例外情况,例如可识别结构,它们的id应该被允许,因为它们的id有一些特殊的含义。但是,作为一项规则,使结构过多地使用只会使它们难以使用,而不会获得任何好处。值类型从不共享,因此变异不是问题


如果仍要使用let,则需要手动定义自己的init。

如果希望属性是可选的,则必须以这种方式声明它们。Int表示需要Int。如果需要可选的Int,请声明它Int

也就是说,我会非常仔细地考虑创建这么多可选的数组和字符串,尤其是可选的数组和字符串。在您的系统中,无库存为零和库存为空[]之间是否存在差异?或者没有名字零和空名字?如果这些值是相同的,那么您通常只希望使用默认值,而不是可选值。选项增加了很多您可能不需要的复杂性

作为默认值的一个示例,使用var将使这一过程变得更加简单,并为您提供您希望的初始值设定项:

struct Main: Codable {
    var meta = Meta()
    var objects: [Object] = []
}

// MARK: - Meta
struct Meta: Codable {
    var status = ""
    var count = 0
    var offset = 0
    var totalcount = 0
}
如果您将这些设置为可选,那么var将再次创建您要查找的初始值设定项:

struct Main: Codable {
    var meta: Meta?
    var objects: [Object]?
}
通常,没有逻辑的简单数据结构应该声明它们的属性var。有一些例外情况,例如可识别结构,它们的id应该被允许,因为它们的id有一些特殊的含义。但是,作为一项规则,使结构过多地使用只会使它们难以使用,而不会获得任何好处。值类型从不共享,因此变异不是问题

如果仍要使用let,则需要手动定义自己的init。

将main更改为此

将main改为this


如果您的结构的所有属性都是可选的,并且您将它们都设置为vars,那么Swift将创建一个初始化器,将您的所有属性默认为nil。就好像您定义了结构,如下所示:

struct AStruct {
    var a: Int?
    var string: String?
    
    //You don't have to define this initializer if all your properties are var Optionals
    init(a: Int? = nil, string: String? = nil) {
        self.a = a
        self.string = string
    }
}
您可以如下方式调用该初始值设定项:

var aStruct = AStruct()

正如亚历山大所指出的,仅仅因为你能做到这一点并不意味着你应该做到这一点。这似乎不是一个好的做法。

如果您的结构的所有属性都是可选的,并且您将它们都设置为VAR,Swift将创建一个初始化器,将您的所有属性默认为零。就好像您定义了结构,如下所示:

struct AStruct {
    var a: Int?
    var string: String?
    
    //You don't have to define this initializer if all your properties are var Optionals
    init(a: Int? = nil, string: String? = nil) {
        self.a = a
        self.string = string
    }
}
您可以如下方式调用该初始值设定项:

var aStruct = AStruct()

正如亚历山大所指出的,仅仅因为你能做到这一点并不意味着你应该做到这一点。这似乎不是一个好的做法。

嗨,罗布!谢谢你的回答。我已经尝试将所有内容声明为?,但当我尝试使用var sökresultat3=Main3初始化它时,仍然会出现一个错误,它表示调用中缺少参数“from”,插入“from:。Codable不会影响此初始化。如果使用var,就不必编写自己的init。问题是带有值的let被视为常量,而不是默认值。嗨,Rob!谢谢你的回答。我已经尝试将所有内容声明为?,但当我尝试使用var sökresultat3=Main3初始化它时,仍然会出现一个错误,它表示调用中缺少参数“from”,插入“from:。Codable不会影响此初始化。如果使用var,就不必编写自己的init。问题是,带有值的let被视为常量,而不是默认值。嗨,卢卡!!谢谢你的回答。我尝试过这个方法,但当我尝试使用var sökresultat3=Main3初始化它时,仍然会出错,它在调用中表示缺少参数'from',insert'from:。刚刚编辑了这个问题,让我知道它是否有效。Hi Luca!!谢谢你的回答。我已经试过了,但是当我尝试用var sökresultat3=Main3初始化它时,仍然会得到一个错误,它表示缺少参数f
或者调用中的参数'from',insert'from:。刚刚编辑了这个问题,请告诉我它是否有效。我想创建一个表示下面结构的空变量。您可能实际上不希望这样。你到底想达到什么目的?@Alexander我同意过度使用optionals可能不好,但你反对默认的空总管吗?这似乎是一件很自然的事情。你在担心什么?我不知道主管道是什么,所以很难说。但是让所有字段都为空的味道引起了我的注意。基本上,我想创建一个空变量来表示下面的结构,但实际上你可能并不需要它。你到底想达到什么目的?@Alexander我同意过度使用optionals可能不好,但你反对默认的空总管吗?这似乎是一件很自然的事情。你在担心什么?我不知道主管道是什么,所以很难说。但是让所有字段都为空的味道引起了我的注意。斯威夫特将自动为您编写这个初始化器,并给出这个结构。没有必要写它。我认为这是一个巨大的反模式,我不推荐这个。所有东西都默认初始化为0、false、null等的外语开发人员将达到这样的效果,但这几乎不是他们真正需要的。事实就是如此。我编辑了我的答案。斯威夫特将根据这个结构自动为您编写此初始值设定项。没有必要写它。我认为这是一个巨大的反模式,我不推荐这个。所有东西都默认初始化为0、false、null等的外语开发人员将达到这样的效果,但这几乎不是他们真正需要的。事实就是如此。我编辑了我的答案。