如何将url.query转换为swift中的字典?

问题描述:

我有URL在AppDelegate方法。如何将url.query转换为swift中的字典?

func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool { 

} 

网址看起来www.wesite.com/shareplace.html?placeid=123

我的问题是如何将它转换成字典方便地访问。

编辑:我发现一些网站上的一些代码,但它显示在Xcode 9

extension URL { 
    var queryDictionary: [String: AnyObject]? { 
     return URLComponents(url: self, resolvingAgainstBaseURL: false)? 
      .queryItems? 
      .reduce([:], combine: { (var result: [String: AnyObject], queryItem) -> [String: AnyObject] in 
       if queryItem.value?.containsString(",") ?? false { 
        let array = queryItem.value?.componentsSeparatedByString(",") 

        result[queryItem.name] = array 
       } 
       else { 
        result[queryItem.name] = queryItem.value 
       } 

       return result 
      }) 
    } 
} 

.reduce([:], combine: { (var result: [String: AnyObject], queryItem) -> [String: AnyObject] in(VAR结果)参数可能没有足够的 '变种' 说明

简单的扩展

extension URL { 
    var queryDictionary: [String: String]? { 
     guard let query = URLComponents(string: self.absoluteString)?.query else { return nil} 

     var queryStrings = [String: String]() 
     for pair in query.components(separatedBy: "&") { 

      let key = pair.components(separatedBy: "=")[0] 

      let value = pair 
       .components(separatedBy:"=")[1] 
       .replacingOccurrences(of: "+", with: " ") 
       .removingPercentEncoding ?? "" 

      queryStrings[key] = value 
     } 
     return queryStrings 
    } 
} 

用法

let urlString = "http://www.youtube.com/video/4bL4FI1Gz6s?hl=it_IT&iv_logging_level=3&ad_flags=0&endscreen_module=http://s.ytimg.com/yt/swfbin/endscreen-vfl6o3XZn.swf&cid=241&cust_gender=1&avg_rating=4.82280613104" 
let url = URL(string: urlString) 
print(url!.queryDictionary ?? "NONE") 

错误

试试这个:

extension URL { 
    var queryDictionary: [String: AnyObject]? { 
     return URLComponents(url: self, resolvingAgainstBaseURL: false)? 
      .queryItems? 
      .reduce([:], combine: { (lastResult: [String: AnyObject], queryItem) -> [String: AnyObject] in 
       var result = lastResult 
       if queryItem.value?.containsString(",") ?? false { 
        let array = queryItem.value?.componentsSeparatedByString(",") 

        result[queryItem.name] = array 
       } 
       else { 
        result[queryItem.name] = queryItem.value 
       } 

       return result 
      }) 
    } 
} 

guard let urlQuery = URL(string: "https://en.wikipedia.org/wiki/Query_string?title=Main_page&action=raw")?.query else { 
    return 
} 

let queryArray = urlQuery.characters.split { $0 == "&"}.map(String.init) 
var parametersDict: [String: String] = [:] 
for queryParameter in queryArray { 
    // split the queryParam into key/value 
    let keyValueArray = queryParameter.characters.split{$0 == "="}.map(String.init) 
    let key = keyValueArray.first 
    let value = keyValueArray.last 
    parametersDict.updateValue(value!, forKey: key!) 
} 

print(parametersDict) 
// prints ["action": "raw", "title": "Main_page"]