2017-01-02 119 views
24

我想从使用swift的URL获取参数。假设我有以下URL:获取URL参数的值

http://mysite3994.com?test1=blah&test2=blahblah 

如何获取test1和test2的值?

+1

我认为这应该可以帮助您https://gist.github.com/InsertNetan/372c9f51549ea96e5af2 – seggy

回答

50

可以使用belowCode获得帕拉姆

func getQueryStringParameter(url: String, param: String) -> String? { 
    guard let url = URLComponents(string: url) else { return nil } 
    return url.queryItems?.first(where: { $0.name == param })?.value 
} 

呼叫像let test1 = getQueryStringParameter(url, param: "test1")

其他方法,该方法以扩展:

extension URL { 

    public var queryParameters: [String: String]? { 
     guard let components = URLComponents(url: self, resolvingAgainstBaseURL: true), let queryItems = components.queryItems else { 
      return nil 
     } 

     var parameters = [String: String]() 
     for item in queryItems { 
      parameters[item.name] = item.value 
     } 

     return parameters 
    } 
} 
+0

为什么投给'NSURLQueryItem'?一些不必要的 – Alexander

+3

另外,最好使用'first(where:)'而不是'filter(_ :)'然后'first'。它一找到第一场比赛就会停下来,所以速度要快得多。此外,它节省了一个数组分配 – Alexander

+0

@Alexander感谢您的建议,您可以编辑答案,使其更好。 –

19

第1步:创建网址分机号码

extension URL { 
    func valueOf(_ queryParamaterName: String) -> String? { 
     guard let url = URLComponents(string: self.absoluteString) else { return nil } 
     return url.queryItems?.first(where: { $0.name == queryParamaterName })?.value 
    } 
} 

步骤2:如何使用扩展

let newURL = URL(string: "http://mysite3994.com?test1=blah&test2=blahblah")! 

newURL.valueOf("test1") // Output i.e "blah" 
newURL.valueOf("test2") // Output i.e "blahblah" 
3

我也做了一个URL扩展,但把查询参数查找到的下标。

extension URL { 
    subscript(queryParam:String) -> String? { 
     guard let url = URLComponents(string: self.absoluteString) else { return nil } 
     return url.queryItems?.first(where: { $0.name == queryParam })?.value 
    } 
} 

用法:

let url = URL(string: "http://some-website.com/documents/127/?referrer=147&mode=open")! 

let referrer = url["referrer"] // "147" 
let mode  = url["mode"]  // "open"