繁体   English   中英

如何初始化一个空结构?

[英]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,应该让他们的idlet ,因为他们的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM