绕过 ObjC 以 Swift 与 KVC 桥接?

Circumvent ObjC to Swift bridge with KVC?

最近 运行 我们的应用程序崩溃了:

EXC_BREAKPOINT 0x00000001c5c8986c
static URLRequest._unconditionallyBridgeFromObjectiveC(_:)

它来自我们访问请求的 webView 决定策略 属性:

func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
   let req = navigationAction.sourceFrame.request
}

我认为问题出在 swift 库中的这一行: https://github.com/apple/swift-corelibs-foundation/blob/master/Foundation/URLRequest.swift#L298

这里没有守卫,在 objc 端似乎请求为 nil。

我的问题是关于如何绕过 objc 到 swift 桥。 KVC 会避免这种情况吗?

if let req = navigationAction.sourceFrame.value(forKey: "request") as NSURLRequest {
    //do stuff
}

如果没有办法绕过 objc 到 swift 桥,我们将不得不忍受崩溃?它发生的频率不是太高,但足以让我们很乐意修复。

我认为当错误发生时,您假设 requestnil 是正确的。 here.
描述了类似的问题 由于 URLRequest.swift,如 apple/swift-corelibs-foundation 中所定义,如果请求是 nil,您引用的内容肯定会崩溃,因此在这种情况下无法使用它。
一种选择是明确使用 KVO,因为 func value(forKey key: String) -> Any? 可以 return nil 值,见 here.
但是,您只能使用它,如果调用函数的对象采用 NSKeyValueCoding 协议,如果对象是 NSObject 的子类,则可以确保该协议,我无法从您的代码片段。
但是既然你已经在你的问题中提出了这个建议,你试过了吗?