2015-11-06 3 views
16

Сигнатура метода String на процент-экранирования является:Почему возвращаемое значение String.addingPercentEncoding() необязательно?

func addingPercentEncoding(withAllowedCharacters: CharacterSet) 
    -> String? 

(Это было stringByAddingPercentEncodingWithAllowedCharacters в Swift 2.)

Почему этот метод возвращает необязательный?

В документации сказано, что метод возвращает ноль «если преобразование не представляется возможным», но неясно, при каких обстоятельствах побега преобразование может не:

  • символы экранируются с помощью UTF-8, который полная кодировка Unicode. Любой допустимый символ Юникода может быть закодирован с использованием UTF-8 и, таким образом, может быть экранирован.

  • Я подумал, что, возможно, метод применил какую-то проверку здравомыслия для плохих взаимодействий между набором разрешенных символов и символов, используемых для экранирования, но это не так: метод преуспевает независимо от того, установлен ли набор разрешенных символов содержит «%», а также успешно, если разрешенный набор символов пуст.

В его нынешнем виде необязательное возвращаемое значение, по-видимому, вызывает неудобную проверку ошибок.

ответ

25

Я подал отчет об ошибке с Apple об этом, и услышал ответ - с очень полезным ответом, не меньше!

Оказывается (к моему удивлению), что можно успешно создать строки Swift, содержащие недопустимый Unicode в виде непарных символов UTF-16. Такая строка может привести к сбою кодировки UTF-8. Ниже приведен код, иллюстрирующий это поведение:

// Succeeds (wat?!): 
let str = String(
    bytes: [0xD8, 0x00] as [UInt8], 
    encoding: String.Encoding.utf16BigEndian)! 

// Returns nil: 
str.addingPercentEncoding(withAllowedCharacters: 
    CharacterSet.alphanumerics) 
Смежные вопросы