我需要传递简单字典:
var dictionary: [AnyHashable: Any] = [
"a": 1,
"b": "title",
"c": ["a", "b"],
"d": ["a": 1, "b": ["a", "b"]]
]
到网址:
let url = URL(string: "http://example.com")!
我该怎么做?
从另一方面来说,如何从URL访问参数?
imessage中的输出:
答案 0 :(得分:12)
根据您的参数要求,我不知道这是否是您要找的......但
如果您想要追加并检查网址参数,可以使用NSURLComponents
在你的情况下,你可以逃避这样的事情:
var dictionary: [AnyHashable: Any] = [
"a": 1,
"b": "title",
"c": ["a", "b"],
"d": ["a": 1, "b": ["a", "b"]]
]
let url = URL(string: "http://example.com")!
var urlComponents = URLComponents(url: url, resolvingAgainstBaseURL: false)
let queryItems = dictionary.map{
return URLQueryItem(name: "\($0)", value: "\($1)")
}
urlComponents?.queryItems = queryItems
print(urlComponents?.url) //gives me Optional(http://example.com?b=title&a=1&d=%5B%22b%22:%20%5B%22a%22,%20%22b%22%5D,%20%22a%22:%201%5D&c=%5B%22a%22,%20%22b%22%5D)
有趣的部分是URLComponents
本身,它将您提供的URL“爆炸”成可以检查的部分。
然后,要添加URL查询参数,请使用URLQueryItem
类,并将这些URLQueryItem
项的数组提供给URLComponents
实例。在这个简单的例子中,我只是map
从你的字典到URLQueryItem
的数组,但你可能会想到更坚实的东西:)
URLComponents
当然也可以反过来使用...我的意思是,如果你有一个带参数的URL,你可以创建一个URLComponents
的实例,然后查询{{1} }。
希望对你有所帮助。
答案 1 :(得分:3)
如果您只是想从值字典创建一个参数字符串,并希望它很简单,您可以这样做:
var str = ""
for key in dictionary.keys {
if str.isEmpty {
str = "\(key)=\(dictionary[key]!)"
} else {
str += "&\(key)=\(dictionary[key]!)"
}
但是,上述内容不对特殊字符进行编码,也不进行任何其他特殊处理。因此,更好的选择是沿着以下几行向Dictionary添加扩展名:
extension Dictionary {
var queryParameters: String {
var parts: [String] = []
for (key, value) in self {
let part = String(format: "%@=%@",
String(describing: key).addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!,
String(describing: value).addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!)
parts.append(part as String)
}
return parts.joined(separator: "&")
}
}
}
然后,您可以简单地说dictionary.queryParameters
来获取将字典内容转换为参数字符串的字符串。