ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Stryng
    Library 2021. 10. 24. 10:13

    안녕하세요. 그린입니다🟢

    이번 포스팅에서는 외부 라이브러리인 Stryng에 대해 학습해보겠습니다🧑🏻‍💻

    다들 한번쯤이 아닌 꽤 자주 Swift에서 문자열을 다루면서 화딱지가 난 경험들이 많이 있을겁니다.
    저도 알고리즘 코딩 문제를 풀때도 그렇고 프로젝트를 진행할때도 문자열을 다뤄줘야하는 부분
    예를들어 문자열의 몇번째 요소들을 접근하여 변경하고 이런 부분들이 Swift가 정말 취약한 부분이라고 생각했어요.
    다른 언어에 비해 문자열 처리가 번거롭다고 느껴졌습니다!
    그러던 찰나 꽤나 문자열을 꽤나 쉽게 사용할 수 있는 라이브러리를 몰고왔습니다🙌

    Stryng

    일반적이고 기억하기 쉬운 첨자 구문을 사용하고 Int 인덱스가 있는 문자 및 범위에 액세스하여 문자열 작업을 더 쉽게 하도록 설계된 라이브러리👍🏻

    설치

    Cocoapods과 SPM을 통해 라이브러리를 설치할 수 있습니다.

    // Cocoapods
    pod 'Stryng'
    
    // SPM
    .package(url: "https://github.com/BalestraPatrick/Stryng.git", from: "0.4.1")

    다만 SPM으로 설치 시 최종적으로 터미널에서 아래 명령어를 통해 업데이트를 시켜줘야합니다.

    $ swift package update

    이렇게되면 Stryng을 import하여 사용할 준비가 끝난것입니다.

    사용

    크게 3가지 사용으로 해볼 수 있습니다.

    1. 문자열에서 특정 문자 찾기

    // Stryng 사용
    let string = "Green"
    string[1] // "r"
    
    // 기존 Swift
    string[string.index(string.startIndex, offsetBy: 1)] // "r"

    원래의 Swift에서 문자열을 다뤄주는 부분이 참 간단해졌죠?

    단순하게 원하는 인덱스를 넣어주기만 한다면 문자를 찾을 수 있습니다.

    더이상 startIndex와 offsetBy 지옥에서 벗어나와...!🔥

     

    2. 문자열에서 원하는 범위안의 문자열 찾기

    // Stryng 사용
    let string = "Green"
    string[..<3] // "Gre"
    
    // 기존 Swift
    string[..<string.index(string.startIndex, offsetBy: 3)] // "Gre"
    // Stryng 사용
    let string = "Green"
    string[1..<3] // "re"
    
    // 기존 Swift
    string[string.index(string.startIndex, offsetBy: 1)..<string.index(string.startIndex, offsetBy: 3)] // "re"

    이렇게 간단하게 원하는 문자열의 크기 및 위치를 주게되면 해당 문자열만 빼올 수 있습니다.

    참 간단하죠?

    기존에는 위의 코드처럼 장황하게 사용해야했던 부분이 직관적이고 가독성이 좋은 코드로 변모했습니다👍🏻

    중요한건 해당 부분을 자른 문자열의 타입은 SubString 타입입니다.

    그럼으로 만약 필요에 의해 String 타입이 되어야 한다면 아래와 같이 타입 변환을 해줘야합니다.

    let string = "Green"
    let convertedString = string[..<3].map(String.init)

     

    3. 주어진 문자열이 포함된 위치 찾기

    let string = "Green Green"
    let occurences = string["Gr"] // [0, 6]

    위와 같이 주어진 문자열의 범위에서 원하는 문자열을 찾을때 간단히 저렇게 찾을 수 있습니다.

    다만 찾고자하는 문자열들이 포함되어있는 모든 위치가 Array 타입으로 만들어져 반환됩니다!

    추가적인 사용

    문자열에서 시작되는 문자열과 끝나는 문자열을 주어 해당하는 위치를 찾을 수 있습니다.

    // String["begin"..."end"]
    public subscript(range: ClosedRange<String>) -> [ClosedRange<String.Index>]
    
    // String["begin"..<"end"]
    public subscript(range: Range<String>) -> [Range<String.Index>]

    해당 공식문서 및 코드에는 요렇게 정의되어 있습니다..!

    당연히 여러 부분이 일치 할 수 있으니 Array 타입을 반환해줍니다.

    해당 라이브러리에서 Swift 문자열에 대한 의견

    이 라이브러리를 만든 BalestraPatrick는 리드미에 아래와 같은 Swift 문자열에 대한 자신의 의견을 남겼습니다.

    "Swift의 문자열 순회는 느릴 수 있습니다. 이러한 첨자가 표준 라이브러리에 존재하지 않는 이유는 어떤 사람들은 이것이 문자열 순회의 성능 영향을 숨기고 있다고 생각하기 때문입니다. startIndex부터 endIndex까지 순회할때 시간 복잡도는 O(n)을 가집니다. 특정 인덱스에서 문자를 가져와야 하는 경우 어떤 식으로든 문자열을 탐색해야 하지만 수행 중인 작업을 알고 있다면 1줄 대신 3줄의 코드가 필요한 이유는 무엇입니까?"

    저도 문자열 순회의 성능이 좋지 않은거에는 동의하지만 이걸 숨기고 있다?라는건 잘모르겠습니다🥲

    결과가 어떻든 해당 라이브러리의 사용은 개개인의 선택입니다.

     

    이렇게 간단하게 문자열을 다뤄주는 Stryng에 대해 학습해보았습니다!
    참 별거 아닌것을 해주는것 같지만 이걸 사용하면 다시 문자열을 Swift스럽게 다뤄주는걸로 못돌아갈것 같아요🥲
    이렇기에 외부 라이브러리의 사용들이 참 호불호가 갈리게 되고 조심스러워지게 됩니다.
    라이브러리 의존성을 줄여야지 줄여야지 하면서도 신기하고 편한 라이브러리가 있으면 학습하고 사용해보고 싶은 욕망🐍

     

    [참고자료]

    https://github.com/BalestraPatrick/Stryng

     

    GitHub - BalestraPatrick/Stryng: Swift strings taken to a whole new syntax level.

    Swift strings taken to a whole new syntax level. Contribute to BalestraPatrick/Stryng development by creating an account on GitHub.

    github.com

     

    'Library' 카테고리의 다른 글

    Code Scanner  (0) 2021.12.07
    Kin  (0) 2021.12.04
    NaverMap SDK - 경로선 & 화살표  (0) 2021.08.13
    UIKitPlus - View  (0) 2021.06.26
    UIKitPlus - RootViewController  (0) 2021.06.23
Designed by Tistory.