如何初始化一个空结构体?

Axx*_*xxi 5 arrays struct swift

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

\n
// MARK: - Main\nstruct Main: Codable {\n    let meta: Meta\n    let objects: [Object]\n}\n\n// MARK: - Meta\nstruct Meta: Codable {\n    let status: String\n    let count, offset, totalcount: Int\n}\n\n// MARK: - Object\nstruct Object: Codable {\n    let id:Int\n    let url: String\n    let displayname: String\n    let inventory: [Inventory]\n    let media: [Media]\n}\n\n\n// MARK: - Inventory\nstruct Inventory: Codable {\n   let id, warehouseid, instock, threshold: Int\n    let reserved: Int\n    let coordinates, note: String\n    let prodno: Int\n    let lastinventory: String\n    let soldout, onpurchaseorders, generation: Int\n    let created, changed: String\n}\n\n// MARK: - Media\nstruct Media: Codable {\n    let id, prodno: Int\n    let webpath: String\n    let slot: Int\n    let type, extdata: String\n    let ctime, xsize, ysize, mediasetid: Int\n    let alt, title: String\n    let generation: Int\n    let created, changed: String\n}\n
Run Code Online (Sandbox Code Playgroud)\n

使用下面的代码,我收到错误消息“在调用初始化程序时没有完全匹配,如果我更改代码,则会出现一堆其他错误。

\n
var s\xc3\xb6kresultat3 = Main3()\n
Run Code Online (Sandbox Code Playgroud)\n

Rob*_*ier 5

如果您希望属性是可选的,那么您必须以这种方式声明它们。Int意味着你想要一个 Int。如果您想要一个可选的 Int,那么声明它Int?

也就是说,我会非常考虑创建这么多可选值,特别是可选数组和字符串。nil您的系统中“无库存”( ) 和“库存清单为空”( )之间有区别吗[]?或者“无名”(nil)和“空名”("")?如果它们相同,那么您通常会更喜欢仅使用默认值,而不是可选值。选项增加了很多您可能不需要的复杂性。

作为默认值的示例,使用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
}
Run Code Online (Sandbox Code Playgroud)

如果您确实将这些设置为可选,那么var将再次创建您正在寻找的初始值设定项:

struct Main: Codable {
    var meta: Meta?
    var objects: [Object]?
}
Run Code Online (Sandbox Code Playgroud)

通常,没有逻辑的简单数据结构应该声明它们的属性var。有一些例外,例如可识别的结构,它们应该是id这样的let,因为它们id有一些特殊的含义。但通常来说,过多地创建结构let只会使它们难以使用而不会获得任何好处。(值类型永远不会共享,因此突变不是问题。)

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