2015-11-06 29 views
16

Podpis metody String o ucieczce-procentowy wynosi:Dlaczego wartość zwracana przez String.addingPercentEncoding() jest opcjonalna?

func addingPercentEncoding(withAllowedCharacters: CharacterSet) 
    -> String? 

(To był stringByAddingPercentEncodingWithAllowedCharacters w Swift 2.)

Dlaczego ta metoda powrotu opcjonalny?

Dokumentacja mówi, że metoda zwraca nil „jeżeli transformacja nie jest możliwe”, ale nie wiadomo, w jakich okolicznościach transformacja ucieczce może zawodzić:

  • Postacie są uciekł za pomocą UTF-8, który jest kompletne kodowanie Unicode. Każdy poprawny znak Unicode może być zakodowany przy użyciu UTF-8, a zatem można go uzyskać.

  • myślałem chyba metoda stosowana pewnego rodzaju kontrola poprawności dla złych interakcji między zestawu dozwolonych znaków i znaków używanych do ucieczki, ale nie jest to przypadek: metoda powiedzie bez względu czy zestaw dozwolonych znaków zawiera "%", a także się powiedzie, jeśli dozwolony zestaw znaków jest pusty.

W tej wersji, nieobowiązkowa wartość zwracana wydaje się wymuszać bezsensowną kontrolę błędu.

Odpowiedz

25

Złożyłem raport o błędzie z Apple o tym i usłyszałem z powrotem - z bardzo pomocną odpowiedzią, nie mniej!

Okazało się (ku mojemu zdziwieniu), że z powodzeniem można tworzyć ciągi Swift zawierające niepoprawny kod Unicode w postaci niesparowanych znaków zastępczych UTF-16. Taki ciąg może spowodować uszkodzenie kodowania UTF-8. Oto kod ilustrujący to zachowanie:

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

// Returns nil: 
str.addingPercentEncoding(withAllowedCharacters: 
    CharacterSet.alphanumerics)