«Нет точных совпадений при вызове инициализатора» с использованием пакета OpenKitten / BSON

#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)")
}