Преобразовать словарь в строку запроса в 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)