【问题标题】:How do I convert a WKScriptMessage.body to a struct?如何将 WKScriptMessage.body 转换为结构?
【发布时间】:2020-11-24 18:46:27
【问题描述】:

我设置了WKScriptMessageHandler 函数userContentController(WKUserContentController, didReceive: WKScriptMessage) 来处理发送到本机应用程序的JavaScript 消息。我提前知道消息正文将始终返回相同的字段。如何将声明为AnyWKScriptMessage.body 转换为结构?

【问题讨论】:

    标签: swift wknavigationdelegate


    【解决方案1】:

    安全类型转换到例如字典呢?

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

    或者作为一个选项,您可以将正文作为 json 字符串发送并使用可编码将其序列化。

    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)
    

    【讨论】:

    • 第二种使用结构的方法救了我:可能问题是字符串值在其中有转义,所以只是有条件地展开为?字符串甚至没有工作。谢谢!
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-09
      • 1970-01-01
      • 2021-10-18
      • 2018-11-23
      • 2021-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多