Спасибо за вашу помощь. Мне нужно взаимодействие с файлами Toml в моем приложении MacOS Swift. Я использую библиотеку TOMLDecoder для разбора формата Toml. Библиотека работает, указывая тип структуры Swift, который соответствует Codable, и библиотека создает объект для нас. Из документов:
struct Discography: Codable {
struct Album: Codable {
let name: String
struct Song: Codable {
let name: String
}
let songs: [Song]
}
let albums: [Album]
}
Если мы возьмем образец файла Toml:
[[albums]]
name = "Born to Run"
[[albums.songs]]
name = "Jungleland"
[[albums.songs]]
name = "Meeting Across the River"
[[albums]]
name = "Born in the USA"
[[albums.songs]]
name = "Glory Days"
[[albums.songs]]
name = "Dancing in the Dark"
Мы можем разобрать его с помощью:
let tomlData = try? Data(contentsOf: URL(fileURLWithPath: "/path/to/file"))
let discography = try? TOMLDecoder().decode(Discography.self, from: tomlData)
Вот мой вопрос. Библиотека не предоставляет возможности обратить процесс, чтобы сериализовать обратно объект, поэтому я хотел бы написать это самостоятельно, и, возможно, я хотел бы добиться решения в чистом Swift, если я правильно понимаю, с помощью типа T, что позволяет сериализовать любой объект, соответствующий Codable. Функция декодирования в библиотеке:
public func decode<T: Decodable>(_ type: T.Type, from text: String) throws -> T {
let topLevel: Any
do {
topLevel = try TOMLDeserializer.tomlTable(with: text)
} catch {
throw DecodingError.dataCorrupted(DecodingError.Context(codingPath: [], debugDescription: "The given data was not valid TOML.", underlyingError: error))
}
let decoder = TOMLDecoderImpl(referencing: self, options: self.options)
guard let value = try decoder.unbox(topLevel, as: type) else {
throw DecodingError.valueNotFound(type, DecodingError.Context(codingPath: [], debugDescription: "The given data did not contain a top-level value."))
}
return value
}
Я начал писать свою функцию кодирования следующим образом:
class TOMLEncoder: TOMLDecoder {
func encode<T>(sourceObject: T) -> String {
return "Sample serialized text..."
}
}
Я действительно не знаю, как действовать... исходя из моих очень ограниченных знаний, я должен как-то повторить свойства sourceObject и создать файл TOML из содержимого этих свойств, но я не уверен, что это правильный подход и как чтобы достичь этого. Любая помощь приветствуется. Спасибо