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 타입으로 반환된다.
근데 이게 어느 방향이 기준인지 엄청 헷갈린다….
내(기준)가 얘(비교하고 싶은 문자열)보다 큰가? 라는 문장을 대입해서 생각해보자!
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
- 종류
- 사용방법
3. range
: 범위에 해당하는 string1의 부분 문자열과 string2 비교
위에서 대입한 문장을 예시로 든다면 아래와 같다.
내(기준)가 얘(비교하고 싶은 문자열)보다 큰가? -> 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)
공식문서
'iOS' 카테고리의 다른 글
[Swift] Class & Struct (0) | 2024.12.13 |
---|