cho.sh
Swift String 조작은 왜 그 모양인가

Swift String 조작은 왜 그 모양인가

Warning

Over a year old. May be outdated

Swift에서 String 다루는 건 생각보다 훨씬 복잡하다. 다들 비슷한 데서 불만이 터진다.

  • String, Substring, Character 타입이 다 따로 있다.
  • Integer로 String을 돌 수가 없다. String.Index라는 타입을 또 써야 한다.

그래서 Python에서는 이렇게 간단한 회문 검사가

python
if string[i] != string[length - 1 - i]:

Swift에서는 이렇게 된다.

swift
if String(string[String.Index(string.startIndex, offsetBy: i)]) != String(string[String.Index(string.endIndex, offsetBy: -i)]) // 대체 왜!

이 장황함이 보이는가?

근데 Swift String이 이렇게 생긴 데는 이유가 있다.

  • Substring. Swift String은 변수에 넣거나 함수에 넘길 때마다 복사된다. 안전하긴 한데, 문자열이 크면 효율이 떨어진다. Substring은 새 인스턴스를 만들지 않아서 훨씬 싸다.

  • String.Index, Character. Swift String은 유니코드를 제대로 다룬다. 이모지 하나가 사실 3~4글자짜리로 합쳐진 걸 본 적 있는가? é, 김, 🇮🇳 같은 Extended grapheme cluster가 들어간 단어가 그렇다. Integer로 세면 글자마다 길이가 제각각인데, String.Index와 Character로 세면 전부 길이 1이다. Apple 예시를 보자.

    swift
    let cafe = "Cafe\u{301} du 🌍"
    print(cafe) // Prints "Café du 🌍"
    print(cafe.count) // Prints "9"
    print(Array(cafe)) // Prints ["C", "a", "f", "é", " ", "d", "u", " ", "🌍"]

결국 모든 건 트레이드오프인 것 같다.

평범한 것과 비범한 것은 딱 한 걸음 차이이다.

  • 지미 존슨 (1943--)
Backlinks2