-
compare과 ComparisonResultSwift 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 연산자를 사용해 NSCaseInsensitiveSearch, NSLiteralSearch, NSNumericSearch 중 하나를 결합합니다.
공식 문서에서는 String Programming Guide를 참고하라고 합니다.
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
https://developer.apple.com/documentation/foundation/comparisonresult
'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