Will
Will

Reputation: 157

How to print Escape Sequence characters in Swift?

Sorry if the title is not clear.

What I mean is this: If I have a variable, we'll call that a, with a value of "Hello\nWorld", it would be written as

var a = "Hello\nWorld

And if I were to print it, I'd get

Hello
World 

How could I print it as:

Hello\nWorld

Upvotes: 6

Views: 6457

Answers (6)

Jordan
Jordan

Reputation: 329

I know this is a little old however I was looking for a solution to the same problem and I figured out something easy.

If you're wanting to print out a string that shows the escape characters like "\nThis Thing\nAlso this"

print(myString.debugDescription)

Upvotes: 11

Leo Dabus
Leo Dabus

Reputation: 236370

Late to the party but the answer to this question is to map the String UnicodeScalarView Unicode.Scalar elements converting them to escaped ascii strings. Then you can simply join back the string:

extension Unicode.Scalar {
    var asciiEscaped: String { escaped(asASCII: true) }
}

extension StringProtocol {
    var asciiEscaped: String {
        unicodeScalars.map(\.asciiEscaped).joined()
    }
}

print("Hello\nWorld".asciiEscaped)   // Hello\nWorld

Upvotes: 1

Alexander
Alexander

Reputation: 63271

Here's a more complete version of @Pedro Castilho's answer.

import Foundation

extension String {
    static let escapeSequences = [
        (original: "\0", escaped: "\\0"),
        (original: "\\", escaped: "\\\\"),
        (original: "\t", escaped: "\\t"),
        (original: "\n", escaped: "\\n"),
        (original: "\r", escaped: "\\r"),
        (original: "\"", escaped: "\\\""),
        (original: "\'", escaped: "\\'"),
    ]

    mutating func literalize() {
        self = self.literalized()
    }

    func literalized() -> String {
        return String.escapeSequences.reduce(self) { string, seq in
            string.replacingOccurrences(of: seq.original, with: seq.escaped)
        }
    }
}

let a = "Hello\0\\\t\n\r\"\'World"
print("Original: \(a)\r\n\r\n\r\n")
print("Literalized: \(a.literalized())")

Upvotes: 7

Pedro Castilho
Pedro Castilho

Reputation: 10522

You can't, not without changing the string itself. The \n character sequence only exists in your code as a representation of a newline character, the compiler will change it into an actual newline.

In other words, the issue here is that the "raw" string is the string with the actual newline.

If you want it to appear as an actual \n, you'll need to escape the backslash. (Change it into \\n)

You could also use the following function to automate this:

func literalize(_ string: String) -> String {
    return string.replacingOccurrences(of: "\n", with: "\\n")
                 .replacingOccurrences(of: "\t", with: "\\t")
}

And so on. You can add more replacingOccurrences calls for every escape sequence you want to literalize.

Upvotes: 2

Amiru Homushi
Amiru Homushi

Reputation: 139

If "Hello\nWorld" is literally the string you're trying to print, then all you do is this:

var str = "Hello\\nWorld"
print(str)

I tested this in the Swift Playgrounds!

Upvotes: 1

Gary
Gary

Reputation: 601

Just use double \

var a = "Hello\\nWorld"

Upvotes: 0

Related Questions