Создайте публичную функцию, описанную здесь здесь :
Public Function GetUserName() As String
' GetUserName = Environ("USERNAME")
' Environ("USERNAME") is easily spoofed, see comment by HansUp
GetUserName = CreateObject("WScript.Network").UserName
End Function
, и используйте =GetUserName()
в качестве значения по умолчанию для элемента управления.
используйте эту структуру
struct YourStruct: Codable {
let menuName: String
let menuID: Int
let menuGroups: [MenuGroup]
enum CodingKeys: String, CodingKey {
case menuName
case menuID = "menuId"
case menuGroups
}
}
struct MenuGroup: Codable {
let type, name: String
let menuEntry: [MenuGroupMenuEntry]
}
struct MenuGroupMenuEntry: Codable {
let type: String
let name: String?
let menuEntry: [MenuEntryMenuEntry]?
let productName, productPrice: String?
}
struct MenuEntryMenuEntry: Codable {
let type, productName, productPrice: String
}
и в datatask после проверки, что у вас нет ошибки
if let data = data {
let decoder = JSONDecoder()
guard let decodedJson = try? decoder.decode(YourStruct.self, from: data) else { completion(nil) ; return }
}
надеюсь, что эта помощь
Вы очень, очень близки и хорошо поработали над проектированием ваших структур данных. Вам просто нужно попытаться декодировать каждую возможную опцию в CategoryItem
.
public init(from decoder: Decoder) throws {
let container = try decoder.singleValueContainer()
if let item = try? container.decode(MenuCategory.self) {
self = .group(item)
} else if let item = try? container.decode(MenuItem.self) {
self = .menuItem(item)
} else {
throw DecodingError.dataCorrupted(.init(codingPath: decoder.codingPath,
debugDescription: "Not a group or item"))
}
}
Этот контейнер является контейнером с одним значением, потому что на этом этапе декодирования вы декодируете только одну вещь, группу или элемент. Каждый из этих отдельных значений должен обрабатывать свои подкомпоненты.