Swift: как использовать ответ от метода SocketIO emitWithAck - PullRequest
0 голосов
/ 12 июня 2018

Я использую библиотеку SocketIO для подключения моего приложения iOS к моему серверу.Я хочу отправить некоторые данные на сервер и вернуть словарь json обратно в подтверждение.В настоящее время у меня есть что-то вроде этого:

SocketHandler.mySocket.emitWithAck("my_event", [session, someInput]).timingOut(after: 3) {data in

       let myData = try? JSONDecoder().decode(myStruct.self, from: data)

MyStruct определяется как класс, наследуемый от Decodable, и напоминает структуру json, которую я ожидаю.

Я получаю следующую ошибку: Невозможно преобразовать значение типа 'Любой' в ожидаемый тип аргумента 'Данные'

Есть идеи, как мне справиться с приведением типа?Или мне нужно пойти совсем другим путем?

(Swift 4.1 для iOS 11.3)

Ура!

1 Ответ

0 голосов
/ 12 июня 2018

Есть две вещи:

  1. decode(_:from:) принимает Data в качестве второго параметра.Чтобы иметь возможность декодировать с Any, вам нужно добавить расширение, чтобы сначала сериализовать данные, а затем передать его на JSONDecoder, например:

    extension Decodable {
      init(from any: Any) throws {
        let data = try JSONSerialization.data(withJSONObject: any)
        self = try JSONDecoder().decode(Self.self, from: data)
      }
    }
    
  2. *Параметр 1014 * относится к типу массива (т.е. [Any]), поэтому вы должны получить первый элемент этого массива.

Чтобы убедиться, что у вас действительно есть декодируемые данные(словарь или объект JSON) вы можете написать что-то вроде этого:

SocketHandler.mySocket.emitWithAck("my_event", [session, someInput]).timingOut(after: 3) { data in
  guard let dict = data.first as? [String: Any] else { return }
  let myData = try? myStruct(from: dict)
  // ...
}
...