Вы можете использовать регулярное выражение для преобразования в регистр змеи и использовать отражение (Mirror) для преобразования в словарь.
Регулярное выражение довольно просто и не будет работать так хорошо, если, например, у вас есть несколько заглавных букв буквы друг за другом, так что эта часть может быть улучшена при необходимости.
func snakeKeyDictionary(_ mirror: Mirror) -> [String: Any] {
var dictionary = [String: Any]()
for (key, value) in mirror.children {
if let key = key {
let snakeKey = key.replacingOccurrences(of: #"[A-Z]"#, with: "_$0", options: .regularExpression).lowercased()
dictionary[snakeKey] = value
}
}
return dictionary
}
Пример использования
let item = AddItemToEvent(key: "1", shoppingListId: "12", shoppingListName: "List",
commonName: "some", storeCode: "ABC", sourceType: "A", sourceId: "fgd",
isDefaultList: "yes", storeLocation: "home")
let mirror = Mirror(reflecting: item)
print(snakeKeyDictionary(mirror))
печать
["common_name": " some "," is_default_list ":" yes "," store_code ":" AB C "," store_location ":" home "," key ":" 1 "," shopping_list_name ":" List "," source_id ": "fgd", "shopping_list_id": "12", "source_type": "A"]
Но, конечно, если целью является создание json данных, это довольно просто
Привести структуру в соответствие Codable
, а затем установить свойство keyEncodingStrategy
при кодировании
let encoder = JSONEncoder()
encoder.keyEncodingStrategy = .convertToSnakeCase