Dans Swift 3 et versions ultérieures, vous pouvez:
let url = URL(string: "http://www.thisismylink.com/postName.php")!
var request = URLRequest(url: url)
request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
request.httpMethod = "POST"
let parameters: [String: Any] = [
    "id": 13,
    "name": "Jack & Jill"
]
request.httpBody = parameters.percentEncoded()
let task = URLSession.shared.dataTask(with: request) { data, response, error in
    guard let data = data, 
        let response = response as? HTTPURLResponse, 
        error == nil else {                                              
        print("error", error ?? "Unknown error")
        return
    }
    guard (200 ... 299) ~= response.statusCode else {                    
        print("statusCode should be 2xx, but is \(response.statusCode)")
        print("response = \(response)")
        return
    }
    let responseString = String(data: data, encoding: .utf8)
    print("responseString = \(responseString)")
}
task.resume()
Où:
extension Dictionary {
    func percentEncoded() -> Data? {
        return map { key, value in
            let escapedKey = "\(key)".addingPercentEncoding(withAllowedCharacters: .urlQueryValueAllowed) ?? ""
            let escapedValue = "\(value)".addingPercentEncoding(withAllowedCharacters: .urlQueryValueAllowed) ?? ""
            return escapedKey + "=" + escapedValue
        }
        .joined(separator: "&")
        .data(using: .utf8)
    }
}
extension CharacterSet { 
    static let urlQueryValueAllowed: CharacterSet = {
        let generalDelimitersToEncode = ":#[]@" 
        let subDelimitersToEncode = "!$&'()*+,;="
        var allowed = CharacterSet.urlQueryAllowed
        allowed.remove(charactersIn: "\(generalDelimitersToEncode)\(subDelimitersToEncode)")
        return allowed
    }()
}
Cela vérifie à la fois les erreurs de réseau fondamentales et les erreurs HTTP de haut niveau. Ce pourcentage échappe également correctement aux paramètres de la requête.
Notez que j'ai utilisé un namede Jack & Jill, pour illustrer le x-www-form-urlencodedrésultat correct de name=Jack%20%26%20Jill, qui est «encodé en pourcentage» (c'est-à-dire que l'espace est remplacé par %20et &la valeur est remplacée par %26).
Voir la révision précédente de cette réponse pour le rendu Swift 2.