Swift - Swift의 특수한 문자열 처리 2

 

String과 Character와 Substring 그리고 문자열 비교

Swift의 특수한 문자열 처리2


  • 문자열은 값 참조 타입이어서 새롭게 사용될 때마다 복사본을 만든다.
  • Character타입은 하나의 문자를 나타내며 String은 Character의 배열이다.
  • String에는 + 연산자를 이용하여 String이나 Character 타입 모두를 덧붙일 수 있으나 Character 타입에는 + 연산자를 사용할 수 없다.
  • 문자열 안에 변수의 값을 삽입하는 경우에는 백슬래시와 괄호를 사용한다.
let multiplier = 3
let message = "\(multiplier) times 2.5 is \(Double(multiplier) * 2.5)"
// message is "3 times 2.5 is 7.5
  • 이 경우에도 확장된 문자열 구분자(#)를 사용할 수 있다.
print(#"Write an interpolated string in Swift using \(multiplier)."#)
// Prints "Write an interpolated string in Swift using \(multiplier).

print(#"6 times 7 is \#(6 * 7)."#)
// Prints "6 times 7 is 42.’
  • Extended Grapheme Clusters를 통해 유니코드 문자들을 유연하게 표현할 수 있다.
let eAcute: Character = "\u{E9}"                         // é
let combinedEAcute: Character = "\u{65}\u{301}"			 // é

// 한글 표현. 두 코드 모두 출력은 '한'이다.
let precomposed: Character = "\u{D55C}"                  // 한
let decomposed: Character = "\u{1112}\u{1161}\u{11AB}"   // ᄒ, ᅡ, ᆫ
  • Extended Grapheme Clusters을 Character타입으로 사용하는 경우 문자열과 연산을 해도 항상 문자열 길이가 늘어나지는 않는다.
var word = "cafe"
print("the number of characters in \(word) is \(word.count)")
// Prints "the number of characters in cafe is 4"

word += "\u{301}"    // COMBINING ACUTE ACCENT, U+0301

print("the number of characters in \(word) is \(word.count)")
// Prints "the number of characters in café is 4
  • prefix(_:)같은 함수를 사용하여 문자열의 일부분을 가져오는 경우 그 결과는 또 다른 문자열이 아니라 Substring 인스턴스이다.
  • Substring은 String과 동일하게 사용할 수 있으나 원본 문자열이 사용되는 동안에만 사용 가능하다. 따라서 Substring을 계속 사용하고 싶다면 String으로 만들어 할당해야 한다.
  • Substring은 성능 최적화를 위해 원본 String 또는 다른 Substring과 메모리를 공유한다. 따라서 Substring이 사용되고 있는동안에는 원본 String도 메모리에서 해제되지 못한다.
  • Substring은 String과 마찬가지로 StringProtocol을 구현했기 때문에 String과 거의 동일하게 사용할 수 있지만 다른 타입이기 때문에 바로 String 타입의 상수나 변수에 할당하지 못한다.
let greeting = "Hello, world!"
let index = greeting.firstIndex(of: ",") ?? greeting.endIndex
let beginning = greeting[..<index]
// beginning is "Hello"

// 아래 문장은 오류가 발생한다.
let otherString:String = beginning

// Convert the result to a String for long-term storage.
let newString = String(beginning)
  • Swift의 문자열 비교에서는 지역을 구분하지 않는다.
  • extended grapheme clusters 중에는 입력은 다르지만 출력이 동알하여 규범적으로 동일한 값으로 여겨지는 것들이 있다.
// "Voulez-vous un café?" using LATIN SMALL LETTER E WITH ACUTE
let eAcuteQuestion = "Voulez-vous un caf\u{E9}?"

// "Voulez-vous un café?" using LATIN SMALL LETTER E and COMBINING ACUTE ACCENT
let combinedEAcuteQuestion = "Voulez-vous un caf\u{65}\u{301}?"

if eAcuteQuestion == combinedEAcuteQuestion {
    print("These two strings are considered equal")
}
//  \u{E9}와 \u{65}\u{301}는 모두 é 문자를 출력하여 위의 두 문장은 같은 문장이 된다.
  • 반면 같은 A지만 ‘LATIN CAPITAL LETTER A와 CYRILLIC CAPITAL LETTER A는 같지 않다.
let latinCapitalLetterA: Character = \u{41} 		// 출력 : A

let cyrillicCapitalLetterA: Character = \u{0410}	// 출력 : А

if latinCapitalLetterA != cyrillicCapitalLetterA {
	print(These two characters are not equivalent.)
}
// Prints “These two characters are not equivalent