Преобразовать словарь в строку запроса в swift?
У меня есть словарь как [String:Any]
Теперь я хочу преобразовать эти словарные ключи и значение как key=value&key=value
Я создал ниже расширение для работы, но это не сработало для меня.
extension Dictionary {
var queryString: String? {
var output: String = ""
for (key,value) in self {
output += "\(key)=\(value)\(&)"
}
return output
}
}
Ответы
Ответ 1
var populatedDictionary = ["key1": "value1", "key2": "value2"]
extension Dictionary {
var queryString: String {
var output: String = ""
for (key,value) in self {
output += "\(key)=\(value)&"
}
output = String(output.characters.dropLast())
return output
}
}
Выход: key1 = значение1 & key2 = значение2
Надеюсь, поможет. Счастливое кодирование !!
Ответ 2
Используйте NSURLQueryItem.
Объект NSURLQueryItem представляет собой единую пару имя/значение для элемента в части запроса URL-адреса. Вы используете элементы запроса с свойством queryItems объекта NSURLComponents.
Чтобы создать один, используйте назначенный инициализатор queryItemWithName:value:
а затем добавьте их в NSURLComponents
для создания NSURL
. Например:
Objective-C:
NSDictionary *queryDictionary = @{ @"q": @"ios", @"count": @"10" };
NSMutableArray *queryItems = [NSMutableArray array];
for (NSString *key in queryDictionary) {
[queryItems addObject:[NSURLQueryItem queryItemWithName:key value:queryDictionary[key]]];
}
components.queryItems = queryItems;
NSURL *url = components.URL; // http://stackoverflow.com?q=ios&count=10
Swift:
let queryDictionary = [ "q": "ios", "count": "10" ]
var components = URLComponents()
components.queryItems = queryDictionary.map {
URLQueryItem(name: $0, value: $1)
}
let URL = components.url
Ответ 3
Другой подход Swift-esque:
let params = [
"id": 2,
"name": "Test"
]
let urlParams = params.flatMap({ (key, value) -> String in
return "\(key)=\(value)"
}).joined(separator: "&")
Ответ 4
extension Dictionary {
var queryString: String? {
return self.reduce("") { "\($0!)\($1.0)=\($1.1)&" }
}
}
Ответ 5
Попробуй это:
func queryItems(dictionary: [String:Any]) -> String {
var components = URLComponents()
print(components.url!)
components.queryItems = dictionary.map {
URLQueryItem(name: $0, value: $1)
}
return (components.url?.absoluteString)!
}
Ответ 6
import Foundation
extension URL {
var queryItemsDictionary: [String: String] {
var queryItemsDictionary = [String: String]()
// we replace the "+" to space and then encode space to "%20" otherwise after creating URLComponents object
// it not possible to distinguish the real percent from the space in the original URL
let plusEncodedString = self.absoluteString.replacingOccurrences(of: "+", with: "%20")
if let queryItems = URLComponents(string: plusEncodedString)?.queryItems {
queryItems.forEach { queryItemsDictionary[$0.name] = $0.value }
}
return queryItemsDictionary
}
}
Это расширение позволит вам анализировать URL-адрес, где вы оба кодировали + знак и пробел с плюсом, например:
https://stackoverflow.com/?q=First+question&email=mail%[email protected]
Это расширение будет анализировать "q" как "Первый вопрос" и "email" как "mail [email protected]",
Ответ 7
То же, что @KKRocks с обновлением для swift 4.1.2
func queryItems(dictionary: [String:Any]) -> String {
var components = URLComponents()
print(components.url!)
components.queryItems = dictionary.map {
URLQueryItem(name: $0, value: String(describing: $1))
}
return (components.url?.absoluteString)!
}
Ответ 8
protocol ParametersConvertible {
func asParameters() -> [String:Any]
}
protocol QueryStringConvertible {
func asQuery() -> String
}
extension QueryStringConvertible where Self: ParametersConvertible {
func asQuery() -> String {
var queries: [URLQueryItem] = []
for (key, value) in self.asParameters() {
queries.append(.init(name: key, value: "\(value)"))
}
guard var components = URLComponents(string: "") else {
return ""
}
components.queryItems = queries
return components.percentEncodedQuery ?? ""
}
}
Ответ 9
Компактная версия ответа @luckyShubhra
Swift 5.0
extension Dictionary {
var queryString: String {
var output: String = ""
forEach({ output += "\($0.key)=\($0.value)&" })
output = String(output.dropLast())
return output
}
}
Usage
Usage
let populatedDictionary = ["key1": "value1", "key2": "value2"]
let urlQuery = populatedDictionary.queryString
print(urlQuery)