基于URLComponent构造URL

848 阅读1分钟

   最开始在项目中处理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
    }