簡體   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