[英]How to initialize an empty struct?
我不知道如何初始化下面的结构? 基本上我想创建一个代表下面结构的空变量,但值应该是可选的/nil,但我不知道如何 go 关于它。
// 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
}
使用下面的代码,我收到错误消息“调用初始化程序时没有完全匹配,如果我更改代码,还会出现一堆其他错误。
var sökresultat3 = Main3()
如果您希望属性是可选的,那么您必须以这种方式声明它们。 Int
表示你想要一个 Int。 如果你想要一个可选的 Int,那么将它声明为Int?
.
也就是说,我会非常考虑创建这么多的 Optional,尤其是可选的 arrays 和字符串。 “无库存”( 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
}
如果您确实将这些设为可选,那么var
将再次创建您正在寻找的初始化程序:
struct Main: Codable {
var meta: Meta?
var objects: [Object]?
}
通常,没有逻辑的简单数据结构应该声明它们的属性var
。 有一些例外,例如 Identifiable structs,应该让他们的id
被let
,因为他们的id
有一些特殊的含义。 但通常,使结构过度let
只会使它们难以使用而不会获得任何好处。 (值类型从不共享,因此变异不是问题。)
如果您仍想使用let
,则需要手动定义自己的init
。
如果您的结构的所有属性都是可选的,并且您将它们全部设为var
,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()
正如亚历山大所指出的,仅仅因为你能做到这一点并不意味着你就应该这样做。 这似乎不是一个好的做法。
将main
更改为此
struct Main: Codable {
var meta: Meta?
var objects: [Object]?
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.