ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Swift - CharacterSet
    Programming/Swift 2021. 8. 7. 21:30

     

     

    오늘 공부해볼 주제는 CharacterSet입니다.

     

    CharacterSet을 이용한 메서드에서 유용한 메서드가 있으므로 String을 공부하면서 같이 공부해보도록 하겠습니다.

     


    CharacterSet

     

    CharacterSet은 검색에서 사용하는 Unicode character의 Set입니다.

    쉽게 말해서 Character들의 모임입니다.

    그리고 이 CharacterSet을 파라미터로 전달해서 문자열을 검색하고 수정할 수 있습니다.

     

    CharacterSet을 사용하기 위해서는 먼저 생성할 줄 알아야겠죠??

    먼저 Swift에서 기본적으로 제공해주는 CharacterSet이 존재합니다.

     

     

    종류가 생각보다 많습니다.

    대부분 이름을 보면 유추할 수 있는 CharacterSet입니다.

    그럼 바로 코드를 작성해 보겠습니다.

     

    문자열에서 대문자가 있는지 그리고 첫 번째 대문자의 인덱스가 어디인지 구하고 싶습니다.

    기존에 우리가 사용하던 방법으로는 구하기 힘들겠죠???

    이때 사용하는 메서드가 rangeOfCharacter(from:) 입니다.

     


    rangeOfCharacter(from:options:range)

     

    range(of:) 메서드와 차이점은 파라미터로 CharacaterSet을 받습니다.

    CharacterSet.uppercaseLetters는 대문자 문자의 집합입니다.

    그래서 문자열에 대문자가 있다면 범위를 리턴해주고 없다면 nil을 리턴해줍니다.

     

    options도 파라미터로 받습니다.

    그래서 우리가 이전에 공부한 String.CompareOptions도 사용할 수 있습니다.

     

     

    Leading방향에서 첫 번째 대문자는 "L"로 2번째 index에 있습니다.

    그리고 .backwards option을 사용하면 trailing부터 검색을 해서 "P"로 10번째 index에 있는 것을 확인할 수 있습니다.

     


     

    init() 생성자로 빈 CharacterSet 만들기

     

    기본으로 제공해주는 CharacterSet 말고 우리가 직접 만들 수도 있습니다.

    (생성자에 대해서는 이후 생성자 포스팅에서 자세히 다루도록 하겠습니다.)

     

    가장 기본적인 생성자는 빈 CharacterSet을 만드는 init() 생성자입니다.

     

     

    CharacterSet()을 이용해서 빈 CharacterSet를 만들었습니다.

    isEmpty 속성으로 CharacterSet이 비어있는지 아닌지 확인할 수 있습니다.

    처음 생성하면 빈 CharacterSet입니다.

    이 상태로는 사용하는 의미가 없으니 값을 추가시켜보겠습니다.

     

     

    이 메서드를 이용하면 값을 추가시킬 수 있습니다.

    파라미터로 String을 전달하면 CharacterSet에 추가됩니다.

    코드를 보겠습니다.

     

     

    빈 CharacterSet에 "@"를  추가시켰습니다.

    그럼 더 이상 빈 CharacterSet이 아닌 것을 확인할 수 있습니다.

     

    어떤 문자가 있는지 확인해보려면 contains(_:) 메서드를 이용합니다.

    만약 파라미터로 전달한 문자가 CharacterSet에 존재한다면 true를 리턴해줍니다.

     

    추가가 있으면 삭제도 있겠죠??

    삭제는 remove(charactersIn:) 메서드를 이용합니다.

     

     

    insert(characatersIn:)과 형식이 비슷하죠??

    바로 예제를 보도록 하겠습니다.

     

     

    이전에 추가시킨 "@"를 remove 했더니 다시 빈 CharacterSet이 된 것을 확인할 수 있습니다.

     

    여기서 한 가지 의문이 들 수 있습니다.

    CharacterSet 즉 Character의 집합인데 왜 파라미터로 String을 전달할까???

    String으로 전달하면 String 포함된 Character 하나하나를 추가시키는 것과 같습니다.

    예를 들어 "Swift"를 전달하면 S, w, i, f, t가 추가되는 셈입니다.

     

    한번 확인해 보겠습니다.

     

     

    파라미터로 "@." String을 전달했습니다.

    만약 String이 저장됐다면 "@." 이 포함되어 있어야 하고 Character라면 "@", "."이 포함되어 있겠죠??

     

    확인해보면 "@"와 "."이 저장되어 있습니다.

    삭제할 때도 String을 전달하면 포함된 Character들을 모두 삭제시킵니다.

     

     


     

    init(charactersIn:)

     

    매번 CharacterSet을 생성할 때 빈 CharacterSet을 만들고 insert하면 조금 귀찮겠죠??

    처음부터 생성할때 원하는 Set을 만들 수 있습니다.

     

     

    코드를 보면 이전 코드보다 간결하게 CharacterSet을 생성할 수 있습니다.

    그럼 마지막으로 유용한 메서드들을 보겠습니다.

     


     

    components(separatedBy:)

     

    이 메서드는 String을 주어진 CharacterSet을 기준으로 분리해서 배열에 담아 리턴해주는 메서드입니다.

    만약에 String이 separator character로 시작하거나 끝난다면 배열의 시작과 끝은 빈 문자열로 채워집니다.

     

    이전에 만든 customCharSet으로 email을 분리해보겠습니다.

     

     

    CharacterSet과 메서드를 이용하면 분리할 문자가 다른 경우도 이렇게 쉽게 나눌 수 있습니다.

     

     


     

    trimmingCharacters(in:)

     

    이 메서드는 String의 양끝이 주어진 CharacterSet을 포함한다면 양 끝을 삭제한 문자열을 리턴해주는 메서드입니다.

    주로 문자열을 입력받을 때 원치 않게 좌우에 공백이 들어간 경우 이를 제거할 때 자주 사용합니다.

     

     

    코드를 잘 보시면 email 중간과 마지막에 공백이 추가되어 있습니다.

    이 문자열을 trimming 시키면 좌우 공백은 사라졌지만 문자열 내부에 있는 공백은 사라지지 않았습니다.

    이를 해결하려면 우리가 이전에 공부했던 replacingOccurrences(of:with:)를 이용하여 공백은 빈 문자열로 바꿔주면 해결할 수 있습니다.

     

     


     

    참고자료

     

    https://kxcoding.com

     

    여러분의 새로운 도전을 응원합니다 | KxCoding

    Mastering SwiftUI 더 적은 코드로, 더 멋진 UI 만들기

    kxcoding.com

     

     

    https://developer.apple.com/documentation/foundation/characterset

     

    Apple Developer Documentation

     

    developer.apple.com

     

     

     

    728x90
Designed by Tistory.