#swift #bson #swift-package-manager
#swift #bson #swift-package-manager
Вопрос:
Я пытаюсь использовать пакет Swift OpenKitten / BSON в новом проекте, и я не могу получить доступ к каким-либо значениям в созданном Document
, следуя инструкциям README.
Компилятор не может использовать значение.
let data: Document = [ "type": "createSession" ]
let type = String(data["type"])
// ^ No exact matches in call to initializer
print(type);
Если я добавляю точку останова и наблюдаю значение с помощью lldb, у него есть вывод отладчика, поэтому данные существуют:
(lldb) vo data
(BSON.Document) data = ▿ ["type": "createSession"]
▿ storage : ByteBuffer (...)
Я все еще изучаю Swift, и, похоже, эта библиотека реализует множество продвинутых концепций, которые я все еще не уверен, как правильно развернуть.
Что я здесь делаю не так?
Комментарии:
1. Понимание ошибки: «Нет точных совпадений при вызове инициализатора»: дело не в том, что
data
равно нулю / не имеет значения (из вашегоpo data
), просто нет методаinit(_ document: Document)
для String. Таким образом, вы не можете выполнить ` String(data[«type»])`.2. @Larme это было бы так, если бы я пытался
String(data)
, но я не уверен, чтоdata["type"]
было бы, и как получить доступ к его значению.
Ответ №1:
Похоже, что пакет был устаревшим и содержал неточную информацию.
Один из способов правильного декодирования Document
включает использование BSONDecoder().decode(type, from)
, такого как этот:
struct Message: Codable {
let type: String;
}
let data: Document = [ "type": "createSession" ]
do {
let message = try BSONDecoder().decode(Message.self, from: Document(data: data))
print(message.type);
// This should work
} catch {
print("error is (error.localizedDescription)")
}