[英]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.