import Foundation
/// Parses and decodes a complete URL query string into a dictionary.
/// Groups duplicate keys into an array of values.
///
/// - Parameter queryString: The URL query string (with or without leading '?').
/// - Returns: A dictionary mapping keys to arrays of decoded values.
func parseAndDecodeQuery(queryString: String) -> [String: [String]] {
// Ensure the query string has a leading '?' for URLComponents to parse it correctly
let cleanQuery = queryString.hasPrefix("?") ? queryString : "?\(queryString)"
let dummyURLString = "http://localhost/\(cleanQuery)"
guard let components = URLComponents(string: dummyURLString),
let queryItems = components.queryItems else {
return [:]
}
var result: [String: [String]] = [:]
for item in queryItems {
// URLComponents automatically handles decoding and '+' to space conversion
let value = item.value ?? ""
result[item.name, default: []].append(value)
}
return result
}
// --- Program Execution ---
let fullQuery = "search=swift+tutorial&category=programming&tag=beginner&tag=ios"
print("--- Full Query String Parsing ---")
print("Original Query: \(fullQuery)")
let decodedDict = parseAndDecodeQuery(queryString: fullQuery)
print("Decoded Dictionary Result:")
for (key, values) in decodedDict {
print(" \(key) -> \(values)")
}
/*
run:
--- Full Query String Parsing ---
Original Query: search=swift+tutorial&category=programming&tag=beginner&tag=ios
Decoded Dictionary Result:
tag -> ["beginner", "ios"]
category -> ["programming"]
search -> ["swift+tutorial"]
*/