Arrays 如何初始化空结构?
我不知道如何初始化下面的结构?基本上,我想创建一个表示下面结构的空变量,但值应该是可选的/nil,但我不知道如何执行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 }
// 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等的外语开发人员将达到这样的效果,但这几乎不是他们真正需要的。事实就是如此。我编辑了我的答案。