I filed a bug report with Apple about this, and heard back — with a very helpful response, no less!
Turns out (much to my surprise) that it’s possible to successfully create Swift strings that contain invalid Unicode in the form of unpaired UTF-16 surrogate chars. Such a string can cause UTF-8 encoding to fail. Here’s some code that illustrates this behavior:
// Succeeds (wat?!):
let str = String(
bytes: [0xD8, 0x00] as [UInt8],
encoding: .utf16BigEndian)!
// Returns nil:
str.addingPercentEncoding(withAllowedCharacters: .alphanumerics)