Как преобразовать WKScriptMessage.body в структуру?

Я установил WKScriptMessageHandler функция userContentController(WKUserContentController, didReceive: WKScriptMessage)для обработки сообщений JavaScript, отправленных в собственное приложение. Я заранее знаю, что тело сообщения всегда будет возвращаться с теми же полями. Как мне преобразовать WKScriptMessage.body, который объявлен как Any в структуру?

3 ответа

Решение

А как насчет безопасного преобразования типов, например, в словарь?

let body = WKScriptMessage.body
guard let dictionary = body as? [String: String] else { return }

Или, как вариант, вы можете отправить тело в виде строки json и сериализовать его с помощью codable.

struct SomeStruct: Codable {
    let id: String
}

guard let bodyString = WKScriptMessage.body as? String,
      let bodyData = bodyString.data(using: .utf8) else { fatalError() }

let bodyStruct = try? JSONDecoder().decode(SomeStruct.self, from: bodyData)

Ваша определенная структура

      struct EventType:Codable{
    let status: Int!
    let message: String!
}

Метод протокола WKScriptMessageHandler

      func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
    do {
        let jsonData = try JSONSerialization.data(withJSONObject: message.body)
        let eventType = try JSONDecoder().decode(EventType.self, from: jsonData)
    } catch {
        print("fatalError")
    }
}

В SwiftUI message.body - это объект String. Вы можете преобразовать тело в словаре следующим образом:

                  if let bodyString = message.body as? String {
            let data = Data(bodyString.utf8)
            do {
                if let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] {
                    guard let body = json["body"] as? [String: Any] else {
                        return
                    }
                    //use body object
                }
            } catch let error as NSError {
                print("Failed to load: \(error.localizedDescription)")
            }
        }
Другие вопросы по тегам