ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [레인스톤 iOS] 스위프트 easy하게 배워볼까? - 문자열과 문자(2)
    Swift 기초문법 2022. 2. 3. 13:33
    반응형

    안녕하세요!

    iOS개발자로 일하고있는 레인스톤입니다:)

     

    오늘은 문자열과 문자 2편!

    유니코드부터 문자열 카운팅, 문자열 인덱스까지 알아보겠습니다.

    유니코드

    유니코드는 전 세계의 모든 문자를 컴퓨터에서 일관되게 표현하고 다룰 수 있도록 설계된 국제 표준입니다.

     

    유니코드 스칼라

     

    swift의 네이티브 문자열 타입은 유니코드 스칼라 값으로 만들어졌습니다.

    하나의 유니코드는 21비트의 숫자로 구성되어 있습니다.

     

    let a = "\u{0061}"
    let chick = "\u{1F425}"
    
    print(a) // a
    print(chick) // 🐥

     

    자모그룹의 확장

     

    유니코드를 결합하여 사용할 수도 있습니다.

     

    let 한: Character = "\u{D55C}"
    let ㅎㅏㄴ: Character = "\u{1112}\u{1161}\u{11AB}"
    
    print(한) // 한
    print(ㅎㅏㄴ) // 한

     

    문자 카운팅

    문자열의 문자를 세기(카운팅)위해서는 문자열의 count 프로퍼티를 사용하면됩니다.

     

    let failed = "설 연휴 동안 꾸준히 공부하려고 했는데 실패했다...^^"
    print(failed.count) // 31

     

    엇!? 직접 세어보니 31개가 아닌데...?

    라고 생각하시는 분들이 있을 수도 있는데 '공백'도 카운팅을 해주셔야합니다!

     

    let blank = "   "
    print(blank.count) // 3

     

    이렇게 tap을 한번 눌러주고 count를 해보면 3이 나오는 것처럼 말이죠!

    (tap누르면 공백 3칸인 줄 이번에 알았습니다....ㅋㅋ 왜 4칸으로 알고있었지ㅠ)

     

    문자열의 접근과 수정

     

    문자열의 접근과 수정은 메소드 / 프로퍼티를 이용하거나 서브스크립트(subscript) 문법을 통해 가능합니다.

     

    문자열 인덱스

     

    오... swift를 처음 배울 때 지옥을 선사했던 문자열 인덱스입니다.

     

    let stringIndex = "문자열 처음 배울 때 진짜 짜증났던 스위프트 문자열 인덱스"
    print(stringIndex[1])
    
    // 'subscript(_:)' is unavailable: cannot subscript String with an Int, use a String.Index instead

     

    swift에서 [0], [1] 등의 방식으로 문자열에 접근하면 subscript 에러를 내뱉습니다.

    문자열은 Int로 접근(첨자)할 수 없으니 String.Index를 사용하라는 말이군요.

     

    문자열에 사용할 수 있는 stringIndex

     

    • startIndex
    • endIndex
    • index(before:)
    • index(after:)
    • index(_:offsetBy:)
    let stringIndex = "문자열 처음 배울 때 진짜 짜증났던 스위프트 문자열 인덱스"
    
    print(stringIndex[stringIndex.startIndex]) // 문
    print(stringIndex[stringIndex.index(after: stringIndex.startIndex)]) // 자
    print(stringIndex[stringIndex.index(before: stringIndex.endIndex)]) // 스
    print(stringIndex[stringIndex.index(stringIndex.startIndex, offsetBy: 2)]) // 열

     

    숫자 하나 달랑~ 쓰는 것보다 복잡해서 어렵게 보이지만 ㅠㅠ

    조금만 익숙해지면 크게 어렵지 않습니다!

    추가로 for-loop를 통해서도 문자열의 각 index에 접근이 가능합니다.

     

    let stringIndex = "이렇게요"
    
    for idx in stringIndex.indices {
        print(stringIndex[idx])
    }
    
    /*
     이
     렇
     게
     요
     */

     

    indices 프로퍼티를 사용해주면 됩니다.

    아!! 다른 타입 인덱스 접근과 마찬가지로 범위를 벗어날 경우 에러가 발생하니 주의해주세요!

     

    let stringIndex = "문자열 처음 배울 때 진짜 짜증났던 스위프트 문자열 인덱스"
    print(stringIndex[stringIndex.endIndex])
    
    // Thread 1: Fatal error: String index is out of bounds

     

    문자의 삽입과 삭제

     

    문자의 삽입과 삭제에 사용되는 메서드

     

    • insert(at:)
    • insert(contentsOf:at:)
    • remove(at:)
    • removeSubrange(:)
    var hello = "안녕하세요"
    hello.insert("!", at: hello.endIndex)
    print(hello) // 안녕하세요!
    
    hello.insert(contentsOf: " 여러분", at: hello.index(before: hello.endIndex))
    print(hello) // 안녕하세요 여러분!

     

    문자는 이런식으로 insert를 활용하여 삽입해줄 수 있습니다.

     

    var hello = "안녕하세요 여러분!"
    hello.remove(at: hello.index(before: hello.endIndex))
    print(hello) // 안녕하세요 여러분
    
    let range = hello.index(hello.endIndex, offsetBy: -4)..<hello.endIndex
    hello.removeSubrange(range)
    print(hello) // 안녕하세요

     

    삭제도 가능합니다.

    String.Index를 활용하여 range를 사용할 수 있다는 점도 잊지마세요!

     

    끗!

    부분문자열은 생각보다 복잡해서 따로 다뤄야 할 것 같네요.

    문자열은 생각보다 길어지는 군요 ㅠㅠ

    다음 3편에서 부분문자열로 문자열 챕터를 마무리하겠습니다.

    반응형

    댓글

Designed by Tistory.