Raw String

2019-03-04

Swift에서 String을 사용할 때 누구나 겪었을 만한 불편함이 하나 있습니다. 그건 바로 문자열에서 "\를 표현하기 위해 \를 추가로 사용해야 하는 것이죠.

간단한 (예)를 살펴 보겠습니다.

표현하고 싶은 문자는 I love "You" 입니다. You를 "로 감싸기 위해 " 다음과 같이 앞에 \를 추가해야 합니다.

let love = "I love \"You\""

정규식을 사용하는 경우는 더 복잡해 집니다. 정규식 자체도 약간의 복잡함을 갖고 있는데, 여기에 \가 추가되면 보기에 복잡해 보입니다. 아래 정규식은 \Location.latitude 같은 키패스 찾는 정규식입니다.

정규식 자체는 \\[A-Z]+[A-Za-z]+\.[a-z]+ 이렇게 표현되지만, 실제 코드에서 사용하려면 다음과 같이 표현 해야합니다.

let regex1 = "\\\\[A-Z]+[A-Za-z]+\\.[a-z]+"

보시다시피 \가 여러개 추가돼서 복잡해 보입니다. 이렇게 사용된 정규식은 정규식 검증이나, 다른 언어에 복사해서 사용하기 위해 바로 복사해 사용할 수 없고 \를 직접 발라서 사용해야합니다.

그렇다면 "\를 사용하기 위해 \를 추가하는 이런 추가적인 작업은 왜 필요한것 일까요?
그 이유는 "\가 각각 문자열의 시작과 끝을 나타내는 경계 문자(String delimiters)와 이스케이프 문자(Escape characters)로 사용되기 때문입니다.

다시 말해 "는 문자열의 범위의 경계를 파악하기 위한 기호로 사용하고, \는 이스케이프 문자로 문자열(string literals) 안에서 특별한 일을 처리하기 위해 사용하기 때문입니다.

이런 불편함을 해결하고자 Swift 5.0(SE-0200) 에서는 문자열의 경계를 나타내는 새로운 경계 문자 #"..."# 를 추가한 Raw String 을 지원합니다. 무슨 말인지 잘 모르시겠다구요? 예제를 보겠습니다.

위에 들었던 예제를 한번 살펴보죠.

let love1 = "I love \"You\""
let love2 = #"I love "You""#

비교가 되시나요? 문자열을 큰따옴표 대신 #"문자내용"# 로 감싸고 이 문자내용에 "\를 추가적인 \ 없이 사용할 수 있습니다.

앞에서 살펴봤던 정규식을 보죠.

let regex1 = "\\\\[A-Z]+[A-Za-z]+\\.[a-z]+"
let regex2 = #"\\[A-Z]+[A-Za-z]+\.[a-z]+"#

Raw String 문법을 이용해 regex2 같이 추가적인 \없이 정규식을 표현할 수 있습니다.

그렇다면 기존의 문자열 안에 상수나 변수의 내용을 넣고 싶을때 사용했던 \(property)는 어떨까요? 다음과 같이 \#(property)로 표현할 수 있습니다.

let price = 1000
let guide = #"The price of the shoes is \#(price)."#

앞에서 나왔던 것들을 종합해서 사용한 예제는 다음과 같습니다.

let url = "https://apple.com"

let html1 = "<a href=\"\(url)\" title=\"Apple Developer\">"
var html2 = #"<a href="\#(url)" title="Apple Developer">"#

어떤신가요? Raw String을 사용하면 좀더 보기 편하지 않나요? Raw String을 사용하면 이제 더 이상 추가적인 "나, \를 사용할 필요가 없습니다. Yay! 😆

잠깐! 그럼 만약 Raw String 안에 "#(문자열 끝 경계문자)을 써야하는 경우는 어떨까요? 그런 경우에는 문자열 경계 문자를 #"..."# 가 아닌 ##"..."##를 사용하면 됩니다. 그렇게 해서 다음과 같이 표현할 수 있습니다.

let str = ##"My cat is "Good"#GoodDog"##

결과 : My cat is Good#GoodDog

[Swift String에서 경계 문자(Delimiter)의 사용]

String Start Delimiter Escape Delimiter String End Delimiter
" \ "
#" \# "#
##" \## "##
######" \###### "######

이상으로 Swift 5.0에서 추가된 Raw String에 대해 알아보았습니다. Raw String을 사용해 사전 정의된 경계문자 ", \ 등이 포함된 문자를 이제 보다 쉽고 편하게 사용할 수 있습니다. Raw String 덕분에 고통을 덜 수 있겠네요.
다음 포스트에서 또 만나요~ 😊

남은 이야기 (Raw String 문법 디자인 뒷 이야기)

Swift의 Raw String 문법을 디자인할때 Rust에서 영감을 받았는데, Rust에서 사용하는 r"..." 나 이것을 변형한 raw"..." #raw"..." #raw("...") 등을 고려해봤는데 안예쁘고 텍스트 콘텐츠 집중을 방해해서 결국 #"..."# 스타일로 결정했다고 하네요. String을 사용할때 #raw"..." 이런식으로 사용해야 한다고 생각하면 끔찍하네요. 좋은 의미로 역시 🍎스럽네요. 애플 굳! 👍

참고