首页 > 解决方案 > Swift:调用时导致崩溃的 URL 扩展

问题描述

URL我为班级写了这个扩展

extension URL {
        var appendAppParams:  URL {
            let extention_A: String = KeychainWrapper.standard.string(forKey: SOME_KEY) ?? ""
            let extention_B: String = "SOME_VALUE"
        
       //The crash happen in the next line of code
        if self.absoluteString.contains("SOME_STRING") && !(self.absoluteString.contains(URL.KEY_1)) {
            return self.appendItem(key: URL.KEY_1, value: SOME_STRING)
        }
        
        var url = self
        if !url.absoluteString.contains(URL.KEY_1) {
            url = url.appendItem(key: URL.KEY_1, value: SOME_VALUE)
        }
        
        if !url.absoluteString.contains(SOME_KEY){
            url = url.appendItem(key:SOME_KEY, value: SOME_VALUE)
        }
        
        return url
    }
}

appendItemURL类的另一个扩展

extension URL {
func appendItem(key: String, value: String)-> URL {
    var urlComponents = URLComponents(string: self.absoluteString)!
    var queryItems = [URLQueryItem(name: key, value: value)]
    if let originalParams = urlComponents.queryItems {
        queryItems.append(contentsOf: originalParams)
    }
    urlComponents.queryItems = queryItems
    return urlComponents.url!
}

}

extension URL {
    static let KEY_1 = "SOME_VALUE"
}

崩溃打印到控制台:

    *** NSForwarding: warning: object 0x106922cc8 of class 'Swift._SwiftObject' does not implement methodSignatureForSelector: -- trouble ahead
Unrecognized selector +[Swift._SwiftObject absoluteString]
2020-12-18 17:42:55.220568+0200 APP_NAME Unrecognized selector +[Swift._SwiftObject absoluteString]

我如何呼叫分机?

    func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void) {
let webURLString = webView.url?.absoluteString ?? ""
if (!(webURLString.contains(URL.KEY_1))){
            decisionHandler(.cancel)
            redirectTo(urlStr: webURLString)
            return
        }
}
func redirectTo(urlStr: String){
        if let url = URL(string: urlStr) {
            var request = URLRequest(url: url)
                let urlWithAppParams = url.appendAppParams
                request = URLRequest(url: urlWithAppParams)
                self.webView.load(request)
        }
    }

标签: iosswifturlextension-methods

解决方案


推荐阅读