compare

공식 문서

  1. compare
  2. ComparisonResult

ComparisonResult

compare 설명을 위해 ComparisonResult 코드를 먼저 봐야 한다.
ComparisonResult는 enum 타입으로 작을 때, 같을 때, 클 때 이렇게 값이 나눠진다!

frozen public enum ComparisonResult : Int, @unchecked Sendable {
    case orderedAscending = -1    // 작을 때
    case orderedSame = 0          // 같을 때
    case orderedDescending = 1    // 클 때
}

compare

string.compare(String, options: .CompareOptions, range: .Index, locale: Locale)

compare은 다양한 매개변수들을 이용해 상황에 맞춰 응용할 수 있다. 기본적으로 유니코드를 활용하는 건 맞지만 option을 통해 대소문자 무시, 발음 구별 기호 무시 등 다양한 비교 방법을 제공한다. range로 범위를 지정하거나 locale로 특정 언어의 규칙을 고려해, 옵션과 기능을 통해 문자열 비교 방식을 조절할 수 있다.

1. String
let string1 = "apple"
let string2 = "Apple"

let value = string1.compare(string2) 
print(value) // NSComparisonResult

단순한 문자열 비교라면 string1 == string2 이런 형식으로도 가능하다
이처럼 false를 기대하고 위 코드의 value 값을 보면 NSComparisonResult라고 출력되는 것을 볼 수 있다.

func compare(_ string: String) -> ComparisonResult

공식 문서를 보면 compare의 반환 값이 ComparisonResult라는 것을 확인 할 수 있다.
ComparisonResultd인 enum 타입으로 반환된다.
근데 이게 어느 방향이 기준인지 엄청 헷갈린다….
내(기준)가 얘(비교하고 싶은 문자열)보다 큰가? 라는 문장을 대입해서 생각해보자! (아스키 코드에서 대문자 ‘A’의 값은 65이고 소문자 ‘a’의 값은 97이다)
string1이 string2보다 큰가? -> 크다! -> orderedDescending의 rawValue는 1이다

let string1 = "apple"
let string2 = "Apple"

let value = string1.compare(string2) 
print(value.rawValue)  // 1

switch value {
case .orderedAscending : print("orderedAscending")
case .orderedSame : print("orderedSame")
case .orderedDescending : print("orderedDescending")   // 출력
}
2. options

위에서 대입한 문장을 예시로 든다면 아래와 같다.
내(기준)가 얘(비교하고 싶은 문자열)보다 큰가? -> Swift (string1의 부분 문자열)가 Swift(string2)보다 큰가? -> 같다!

let string1 = "Hello, Swift!"
let string2 = "Swift"

// "Swift"의 시작 위치와 길이
let range = string1.index(string1.startIndex, offsetBy: 7)..<string1.index(string1.startIndex, offsetBy: 12)
let value = string1.compare(string2, options: .literal, range: range)

switch value {
case .orderedAscending : print("orderedAscending")
case .orderedSame : print("orderedSame")                // 출력
case .orderedDescending : print("orderedDescending")  
}
4. locale
let string1 = "Hello, Swift!"
let string2 = "Swift"

let locale = Locale(identifier: "en_US") // 미국
string1.compare(string2, options: .caseInsensitive, locale: locale)