Swift
StringProtocol
[Swift] StringProtocol.compare(_:)
[Swift] StringProtocol.compare(_:)
ComparisonResult 를 사용하여 문자열을 비교한다.
func compare<T>(_ aString: T,
options mask: String.CompareOptions = [],
range: Range<Self.Index>? = nil,
locale: Locale? = nil)
-> ComparisonResult where T : StringProtocol
Ascii 기준 정렬
switch "Apple".compare("Google") {
case .orderedAscending:
print(ComparisonResult.orderedAscending.rawValue)
case .orderedSame:
print(ComparisonResult.orderedSame.rawValue)
case .orderedDescending:
print(ComparisonResult.orderedDescending.rawValue)
}
// -1
print(Character("A").asciiValue) // Optional(65)
print(Character("G").asciiValue) // Optional(71)
A 과 G 을 비교하였을 때 65 … 71 이 된다. 따라 Ascending 을 리턴한다.
ascending: [형용사] 오르는, 상승적인; 위를 향한
switch "Gpple".compare("Google") {
case .orderedAscending:
print(ComparisonResult.orderedAscending.rawValue)
case .orderedSame:
print(ComparisonResult.orderedSame.rawValue)
case .orderedDescending:
print(ComparisonResult.orderedDescending.rawValue)
}
// 1
print(Character("p").asciiValue) // Optional(112)
print(Character("o").asciiValue) // Optional(111)
p 과 o 을 비교하였을 때 112 … 111 이 된다. 따라 Descending 을 리턴한다.
descending: [형용사] 내려가는, 강하하는, 하향의(opp. ascending); [컴퓨터] 내림차순의
caseInsensitiveCompare(_:)
대소문자 구분 없이 문자를 비교할때 사용된다.
앞서 compare(_:) 는 ascii 로 구분을 하기 때문에 대소문자를 비교하게 된다.
if "Apple".caseInsensitiveCompare("apple") == ComparisonResult.orderedSame {
print("equal")
} else {
print("not equal")
}
// equal
Eqaul 은 대소문자를 구분한다.
if "Apple" == "apple" {
print("equal")
} else {
print("not equal")
}
// not equal
if NSString("Apple").isEqual(to: NSString("apple")) {
print("equal")
} else {
print("not equal")
}
// not equal
비교연산자
<. <=, >, >= 는 compare(_:) 와 동일하게 동작한다.
if "Apple" < "apple" {
print("orderedAscending")
} else {
print("orderedDescending")
}
// orderedAscending
print(Character("A").asciiValue) // Optional(65)
print(Character("a").asciiValue) // Optional(97)
A 와 a 을 비교하였을 때 65 … 97 이 된다. 따라 조건은 true 가 된다.
compare(_:range:) 특정 Range 를 통한 비교
let ret = "문자열을 비교합니다.".compare("문자열")
print(result.rawValue)
// 1
let text = "문자열"
let textRange = text.startIndex ..< text.endIndex
let ret = "문자열을 비교합니다.".compare(text, range: textRange)
print(ret.rawValue)
// 0
compare(_:options:range:) hasPrefix 와의 비교
let a = "Archives"
print(a.hasPrefix("Arc"))
// true
print(a.hasSuffix("Foundation"))
// false
let range = a.startIndex ..< a.index(a.startIndex, offsetBy: 5)
let ret = a.compare("archi",
options: [.caseInsensitive],
range: range)
print(ret.rawValue)
hasPrefix 는 범위 지정 없이 비교하지만, compare 는 range 를 통해 범위를 확정하여 비교가 가능하다.
댓글남기기