如何将字符串转换为包含 a 的 URL ?在字符串中 Swift 4.2

How can I convert the string to URL which include a ? in the string by Swift 4.2

如题,我用的是Google Places API,URL有个问号,发送请求的时候会变成%3F,怎么办通过 Swift 4.2??

修改我的代码

我找到了很多资料,但他们使用的是 Swift 2 或 3,所以我无法使用!

更新我的代码

let urlString = "\(GOOGLE_MAP_API_BASEURL)key=\(GMS_HTTP_KEY)&input=\(keyword)&sessiontoken=\(ver4uuid!)"
        print(urlString)
        if let encodedString = urlString.addingPercentEncoding(withAllowedCharacters: CharacterSet.alphanumerics
            .union(CharacterSet.urlPathAllowed)
            .union(CharacterSet.urlHostAllowed)) {
            print("encodedString: \(encodedString)")

您应该只编码查询参数(虽然可能只有 keyword 实际上需要编码),而不是整个 URL。

func urlEncode(_ string: String) -> String {
    var allowed = CharacterSet.urlQueryAllowed
    allowed.remove(charactersIn: "!*'();:@&=+$,/?%#[]")
    return string.addingPercentEncoding(withAllowedCharacters: allowed) ?? ""
)

let urlString = "\(GOOGLE_MAP_API_BASEURL)key=\(urlEncode(GMS_HTTP_KEY))&input=\(urlEncode(keyword))&sessiontoken=\(urlEncode(ver4uuid!))"
print(urlString)

另请参阅 Swift - encode URL 了解 URL 参数的正确编码方式。

在这种情况下,我强烈建议使用 URLComponentsURLQueryItem,它们可以非常顺利地处理百分比转义。

var urlComponents = URLComponents(string: GOOGLE_MAP_API_BASEURL)!
let queryItems = [URLQueryItem(name: "key", value: GMS_HTTP_KEY),
                  URLQueryItem(name: "input", value: keyword),
                  URLQueryItem(name: "sessiontoken", value: ver4uuid!)]
urlComponents.queryItems = queryItems
let url = urlComponents.url!