Я думаю, что здесь правильное поведение, потому что% d не является допустимым компонентом URL (% - это escape, но ожидается, что за ним следуют два шестнадцатеричных символа).
Вы не можете просто закодировать URL, как вам дано, потому что это также закодирует / s и? S, что вам не нужно.
Итак, вопрос в том, какое здесь правильное поведение?
Возможно, вы бы хотели, чтобы оно превратилось в ...
http://www.somewebsite.com/method?a=%25d
(т. Е.% Кодируется в кодированную версию% в URL, поэтому, когда метод получает входные данные, он видит, что для него установлено значение% d)
Я не думаю, что есть какая-либо библиотечная функция, которая будет делать такие вещи для вас, поскольку нет «правильного» способа сделать это. Единственное правильное, что вы можете сделать, - это вернуть сообщение об ошибке, в котором говорится, что указанный вами URL-адрес недействителен (как и URLWithString)
Если вы хотите попытаться обработать ввод, я думаю, вам нужно будет найти в URL любые символы%, за которыми сразу не идут два шестнадцатеричных символа, а затем заменить% на% 25 в этом случае. Это должно быть вполне возможно с помощью регулярного выражения, хотя я подозреваю, что могут возникнуть некоторые дополнительные сложности, если ваши URL-адреса начинают содержать закодированные версии символов вне набора символов ASCII.