Как преобразовать 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)")
}
}