ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Swift - Compare String (String 비교하기)
    Programming/Swift 2021. 8. 2. 13:27

     

     

     

    안녕하세요 BeePeach입니다 :)

    오늘 공부할 내용은 문자열 비교입니다.

    문자열은 서로 같은지 다른지 뿐만 아니라 대소도 비교할 수 있습니다.

     

    대소를 비교할 때 기준은 ASCII Code를 따릅니다.

    10진수로 대문자보다 소문자가 32 크기 때문에 소문자와 대문자를 비교하면 소문자가 더 큽니다.

     

     

    [각주:1]">
    ASCII Code Table[각주:2]

    그럼 바로 코드를 보도록 하겠습니다.

     

     

    가장 쉽게 비교하는 방법은 비교연산자를 사용하는 것입니다.

    기본적으로 Swift는 대소문자를 구분하기 때문에 두 문자열이 다른 것을 알 수 있습니다.

    우리가 생각하기에 B가 b보다 크다고 생각하기 쉽지만 ASCII 코드가 비교 기준이므로 대문자로 시작한 Beepeach가 beepeach보다 작은 것을 확인할 수 있습니다.

     


     

    compare(_:options:range:locale:)

     

    비교연사자가 아닌 메서드를 이용해서 비교할 수도 있습니다.

    string 파라미터를 제외하고 나머지 파라미터는 모두 기본값을 가지고 있기 때문에 compare(_:)만 사용해도 됩니다.

     

    첫 번째 파라미터 aString는 호출한 문자열과 비교할 문자열이 옵니다. 비교할 문자열은 nil이 오면 안 됩니다.

    두 번째 파라미터 mask는 검색 옵션을 지정할 수 있습니다. 옵션에 대해서는 다음 포스팅에서 자세히 다루겠습니다. 기본값은 빈 배열입니다.

    세 번째 파라미터는 검색 범위를 지정할 수 있습니다.  범위는 호출한 문자열의 범위를 넘으면 안 됩니다. 기본값은 전체 범위입니다.

    마지막 파라미터 locale은 잘 쓰지 않는 파라미터인데 이 파라미터는 비교 정렬 알고리즘에 영향을 끼칩니다. à과 같은 악센트 문자의 경우 어떤 locale에서는 a 바로 다음 순서이지만 다른 locale에서는 z다음 이기도 합니다. 기본값은 nil이며 system의 locale입니다.

     

    눈여겨봐야 할 부분은 리턴형입니다. 비교 연산자같이 Bool이 아닌 ComparisonResult입니다.

    ComparisonResult가 어떻게 선언되어 있는지 보겠습니다.

     


     

    ComparisonReuslt

     

    ComparisonResult는 enum으로 선언되어 있습니다.

    3가지 케이스가 있는 것을 볼 수가 있죠??

    오름차순(Ascending), 내림차순(Descending), 같다(Same)

    정렬의 순서는 코드 -> 방향입니다.

    compare(_:) 메서드를 호출한 문자열이 첫 번째 파라미터 보다 작다면 오름차순입니다.

    예를 보도록 하겠습니다.

     

     

    A보단 B가 더 큽니다.

    그래서 a.compare(b) 하면 결과는 ComparisonResult.orderedAscending 입니다.

    하지만 우리가 비교를 할 때는 결과를 true 혹은 false로 사용하고 싶어 합니다.

    그럼 a.compare(b)이 ComparisonResult.orderedAscending와 같은지 비교 연산자로 비교하면 됩니다.

    매번 ComparisonResult를 앞에 붙이기 귀찮죠?? 생략이 가능하니 .orderedDescending과 같이 사용하면 됩니다.

     

    그리고 이전에 비교했던 대소문자 비교를 option을 이용하여 비교할 수 있습니다.

    options에 .caseInsensitive 를 전달했습니다. 대소문자를 무시하고 문자열을 비교하는 옵션입니다.

    이 결과를 .orederdSame과 비교하면 true가 나오는 것을 확인할 수 있습니다.

    그런데 코드가 좀 길죠?? 이를 한 번에 비교하는 메서드도 제공합니다.

     


     

    caseInsensitiveCompare(_:)

     

    이 메서드는 compare(_:options:) 메서드에서 options에 .caseInsensitive를 전달한 것과 같은 기능을 합니다.

     

     

    코드가 조금 간결해진 것을 확인할 수 있습니다.

     


     

    hasPrefix(_:), hasSuffix(_:)

     

    이 메서드는 접두어를 비교합니다.

    만약 시작하는 문자열이 파라미터로 전달된 문자열과 같으면 true를 리턴해줍니다.

    hasSuffix(_:) 메서드는 접미어를 비교하는 메서드입니다.

     

     

    Prefix는 앞에서부터 비교를 합니다.

    앞에서부터 Hello로 시작하므로 hasPrefix(_:)를 사용하면 true가 리턴되는 것을 볼 수 있습니다.

    Suffix는 뒤에서부터 비교를 합니다.

    그래서 BeePeach가 들어가 있는 거처럼 보이지만 !가 빠져있습니다. 그래서 false가 리턴되는 것을 확인할 수 있습니다.

     

    hasPrefix(_:) 메서드는 options 파라미터가 없습니다.

    그럼 어떻게 대소문자를 무시하고 비교할 수 있을까요???

     

     

    바로 두 문자열을 모두 대문자나 소문자로 변환시켜서 비교하면 됩니다.

    자세히 봐야 할 부분은 Line 8처럼 비교하는 문자열도 변환시키지 않으면 안 됩니다.

    beePeach!와 beepeach!는 다르게 인식하기 때문이죠.

     

     


     

    참고자료

     

    https://kxcoding.com

     

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

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

    kxcoding.com

     

     

    https://developer.apple.com/documentation/swift/string

     

    Apple Developer Documentation

     

    developer.apple.com

     

     

    1. The RSA Algorithm - Scientific Figure on ResearchGate. Available from: https://www.researchgate.net/figure/ASCII-table-for-the-alphabet_fig1_338623532 [본문으로]
    2. The RSA Algorithm - Scientific Figure on ResearchGate. Available from: https://www.researchgate.net/figure/ASCII-table-for-the-alphabet_fig1_338623532 [본문으로]
    728x90
Designed by Tistory.