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 를 통해 범위를 확정하여 비교가 가능하다.

댓글남기기