最开始在项目中处理url的时候当然是直接写死,类似于这样https://example.com/path/file?query。
但是这样有很多问题,比如老项目的话scheme是不一定的,再比如说query参数也是变化的,还要考虑url编码,如果手动处理这些太麻烦了,于是发现Foundation框架中的URLComponent类,正好可以解决问题。
首先这个类是在iOS7时加的,兼容性没问题。其次这个类构造的URL还能处理URL编码/解码。用这个类构造URL的代码可以简化为这样。
func urlBuilder(scheme: String,host: String,port: Int,path: String,query: Dictionary<String,String>? = nil) -> URL? {
var components = URLComponents()
components.scheme = scheme
components.host = host
components.port = port
components.path = path
if let items = query {
components.queryItems = items.map({
URLQueryItem(name: $0, value: $1)
})
}
return components.url
}
但在很多项目中,除了query之外的部分大多是固定的,所以还能简化为这样。
func urlBuilder(string: String,query: Dictionary<String,String>? = nil) -> URL? {
guard var components = URLComponents(string: string) else {
return nil
}
if let items = query {
components.queryItems = items.map({
URLQueryItem(name: $0, value: $1)
})
}
return components.url
}