ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • compare과 ComparisonResult
    Swift 2023. 2. 8. 09:30

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

    이번 포스팅에서는 문자열을 비교하는 Compare이라는 메서드와 그 반환 타입인 ComparisonResult에 대해 학습해보겠습니다🙌

     

    우선 아주 수도 없이 사용하고 있는 Compare이라는 메서드부터 짚고 넘어가볼께요!

     

    compare?

    파라미터로 지정된 옵션들을 사용해 문자열을 비교하고 범위에 대한 어휘 순서를 반환해줍니다.

    여기서 중요한건 어휘 순서입니다.

    어휘 순서는 아스키 코드값처럼 A보다 Z가 더 크다고 인식해주죠.

    그렇기에 결국 compare 메서드의 역할은 두 문자열을 어휘 순 즉, 정렬 순에 대해 비교해줍니다.

    해당 메서드는 NSString의 인스턴스 메서드로 문자열에서 쉽게 사용할 수 있습니다.

    func compare(
        _ string: String,
        options mask: NSString.CompareOptions = [],
        range rangeOfReceiverToCompare: NSRange,
        locale: Any?
    ) -> ComparisonResult

    정의를 보면 이렇게 비교할 문자열은 꼭 받아와야하고 mask, range, locale에 대한 옵션을 지정할 수 있습니다.

     

    파라미터를 하나씩 살펴볼께요🙌

     

    aString

    range에서 지정한 수신자의 범위를 비교할 문자열 nil이 아닌 값을 넣어줘야 합니다.

     

    mask

    검색 옵션 입니다.

    C bitwise OR 연산자를 사용해 NSCaseInsensitiveSearchNSLiteralSearchNSNumericSearch 중 하나를 결합합니다.

    공식 문서에서는 String Programming Guide를 참고하라고 합니다.

    https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/Strings/introStrings.html#//apple_ref/doc/uid/10000035i

     

    Introduction to String Programming Guide

    Introduction to String Programming Guide String Programming Guide describes how to create, search, concatenate, and draw strings. It also describes character sets, which let you search a string for characters in a group, and scanners, which convert numbers

    developer.apple.com

     

    range

    비교할 범위를 지정해줍니다.

    이때 범위는 피비교대상자의 범위를 초과하여서는 안됩니다.

     

    locale

    NSLocale의 인스턴스로 현재 locale을 이용하려면 그냥 []를 넣어주면 됩니다.

     

    자 그럼 아주 간단히 compare 메서드의 예시를 봐볼께요!
    import Foundation
    
    let firstStr = "Green is Green"
    let secondStr = "Green is Green"
    let thirdStr = "Green is Red"
    
    let firstCompare = firstStr.compare(secondStr)
    let secondCompare = firstStr.compare(thirdStr)
    
    print("1️⃣", firstCompare)
    print("2️⃣", secondCompare)
    print("1️⃣ rawValue", firstCompare.rawValue)
    print("2️⃣ rawValue", secondCompare.rawValue)
    
    // 1️⃣ NSComparisonResult
    // 2️⃣ NSComparisonResult
    // 1️⃣ rawValue 0
    // 2️⃣ rawValue -1

    자 보시면 바로 이해가 가실거에요.

    firstCompare은 동일 문자열을 비교하였고 secondCompare은 다른 문자열을 비교해줬어요.

    출력을 보면 두 비교값 모두 NSComparisonResult 타입과 값을 반환하고 표출해줍니다.

    그래서 rawValue로 찍어보면 0과 -1로 어떤 enum의 지정된 rawValue값을 가진 느낌이 확 나죠!?🥸

     

    자 이제 이어서 바로 저 ComparsionResult가 어떤 타입이고 왜 0과 -1의 rawValue를 가지고 어떤 의미가 있는지 알아보겠습니다!

     

    ComparisonResult

    위에서 말했듯 compare 메서드의 반환 타입으로 정렬 순서를 나타내는 상수입니다.

    즉 계속 언급한 compare 메서드를 통해 두 문자열의 어휘 순서를 비교하게 되는데 이 비교값이 들어간 타입이라고 보면 됩니다.

    @frozen enum ComparisonResult : Int, @unchecked Sendable

    선언은 이렇게 Int를 채택하고 있으니 위에서 본 0과 -1의 의미를 찾을 수 있을것 같아요.

    enum 열거형으로 지정되어 있고 @frozen이 붙었으니 더 케이스가 변경 추가 될 일은 없겠네요!

     

    그럼 이 열거 타입에 들어가있는 case들을 살펴보겠습니다.

     

    orderedAscending

    왼쪽 피연산자가 오른쪽 연산자보다 작은 경우입니다.

    case orderedAscending = -1

    이렇게 rawValue는 -1을 가집니다.

    예시로 어떤건지 보여드릴께요ㅎㅎ

    import Foundation
    
    let firstStr = "ABC"
    let secondStr = "ACE"
    
    let compareValue = firstStr.compare(secondStr)
    
    print(compareValue.rawValue)
    
    // -1

    이렇게 맨 앞 A부터 비교하게 되는데 A는 동일한 순이지만 B(피연산자)가 C(연산자)보다 작은 순서를 가지니 해당 케이스에 걸리고 -1의 rawValue를 갖게되는 것이죠.

     

    orderedSame

    피연산자와 연산자가 같은 경우입니다.

    case orderedSame = 0

    이렇게 rawValue로는 0을 가지게 됩니다.

    위에서 동일하게 Green is Green의 문자열을 비교했을때 0이 나온거 기억하시죠!?

    해당 케이스에 걸린 경우입니다👍

     

    orderedDescending

    왼쪽 피연산자가 오른쪽 연산자보다 큰 경우입니다.

    case orderedDescending = 1

    rawValue로는 1을 가지게 됩니다.

    이것도 예시로 간단히 살펴보시죠!

    import Foundation
    
    let firstStr = "zebra"
    let secondStr = "xyz"
    
    let compareValue = firstStr.compare(secondStr)
    print(compareValue.rawValue)
    
    // 1

    z가 x보다 높은 순서를 가지니 처음부터 바로 비교가 끝나게 되고 해당 케이스를 반환해줍니다.

     

    자 그럼 대소문자는 어떻게 될까요?

    import Foundation
    
    let firstStr = "GREEN"
    let secondStr = "green"
    
    let compareValue = firstStr.compare(secondStr)
    print(compareValue.rawValue)
    
    // -1

    보시는것처럼 같은 그린이라는 알파벳 대소문자라도 소문자가 대문자보다 정렬 순서를 크게 가져갑니다.

    (대문자라서 그냥 뭔가 더 클줄 알았는데 아스키 코드로는 아닌것 같네요ㅎㅎ)

     

    마무리

    매번 사용하던 compare을 톺아보는 포스팅이였네요!

    내용이 간단해서 알던 compare도 다시보자 이런느낌입니다~

    오늘이 한줄 요약 👉🏻 공식문서 보는것을 더 생활하하자🙌

     

    [참고 자료]

    https://developer.apple.com/documentation/foundation/nsstring/1414561-compare

     

    Apple Developer Documentation

     

    developer.apple.com

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

     

    Apple Developer Documentation

     

    developer.apple.com

    'Swift' 카테고리의 다른 글

    debugPrint와 print 알고쓰기 (feat. dump)  (8) 2023.05.08
    Swift 5.8  (4) 2023.04.04
    CGFloat  (3) 2023.01.20
    projectedValue  (1) 2023.01.17
    ArraySlice  (3) 2023.01.12
Designed by Tistory.