Swift 3 (esqueça o NSURL).
let fileName = "20-01-2017 22:47"
let folderString = "file:///var/mobile/someLongPath"
Para transformar um URL em uma string:
let folder: URL? = Foundation.URL(string: folderString)
// Optional<URL>
// ▿ some : file:///var/mobile/someLongPath
Se queremos adicionar o nome do arquivo. Observe que appendingPathComponent () adiciona a porcentagem de codificação automaticamente:
let folderWithFilename: URL? = folder?.appendingPathComponent(fileName)
// Optional<URL>
// ▿ some : file:///var/mobile/someLongPath/20-01-2017%2022:47
Quando queremos ter String, mas sem a parte raiz (preste atenção que a porcentagem de codificação é removida automaticamente):
let folderWithFilename: String? = folderWithFilename.path
// ▿ Optional<String>
// - some : "/var/mobile/someLongPath/20-01-2017 22:47"
Se queremos manter a parte raiz, fazemos isso (mas lembre-se da porcentagem de codificação - ela não é removida):
let folderWithFilenameAbsoluteString: String? = folderWithFilenameURL.absoluteString
// ▿ Optional<String>
// - some : "file:///var/mobile/someLongPath/20-01-2017%2022:47"
Para adicionar manualmente a porcentagem de codificação para uma sequência:
let folderWithFilenameAndEncoding: String? = folderWithFilename.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed)
// ▿ Optional<String>
// - some : "/var/mobile/someLongPath/20-01-2017%2022:47"
Para remover a porcentagem de codificação:
let folderWithFilenameAbsoluteStringNoEncodig: String? = folderWithFilenameAbsoluteString.removingPercentEncoding
// ▿ Optional<String>
// - some : "file:///var/mobile/someLongPath/20-01-2017 22:47"
A codificação percentual é importante porque os URLs para solicitações de rede precisam deles, enquanto os URLs para o sistema de arquivos nem sempre funcionam - depende do método real que os utiliza. A ressalva aqui é que elas podem ser removidas ou adicionadas automaticamente, portanto é melhor depurar essas conversões com cuidado.