신속한 무시 케이스에서 두 문자열을 어떻게 비교할 수 있습니까? 예 :
var a = "Cash"
var b = "cash"
var a와 var b를 비교하면 true를 반환하는 메서드가 있습니까?
신속한 무시 케이스에서 두 문자열을 어떻게 비교할 수 있습니까? 예 :
var a = "Cash"
var b = "cash"
var a와 var b를 비교하면 true를 반환하는 메서드가 있습니까?
lowercaseString
그가 (! 예를 들어 = STRASSE 트) 일부 언어에서 실패하는 몇 가지 답변에서 언급 한
caseInsensitiveCompare:
localizedCaseInsensitiveCompare:
"Straße".localizedCaseInsensitiveCompare("STRASSE")
-가져 오는 것을 기억하십시오 Foundation
)
답변:
이 시도:
var a = "Cash"
var b = "cash"
let result: NSComparisonResult = a.compare(b, options: NSStringCompareOptions.CaseInsensitiveSearch, range: nil, locale: nil)
// You can also ignore last two parameters(thanks 0x7fffffff)
//let result: NSComparisonResult = a.compare(b, options: NSStringCompareOptions.CaseInsensitiveSearch)
결과는 NSComparisonResult 열거 형 유형입니다.
enum NSComparisonResult : Int {
case OrderedAscending
case OrderedSame
case OrderedDescending
}
따라서 if 문을 사용할 수 있습니다.
if result == .OrderedSame {
println("equal")
} else {
println("not equal")
}
이 시도 :
이전 Swift의 경우 :
var a : String = "Cash"
var b : String = "cash"
if(a.caseInsensitiveCompare(b) == NSComparisonResult.OrderedSame){
println("voila")
}
Swift 3+
var a : String = "Cash"
var b : String = "cash"
if(a.caseInsensitiveCompare(b) == .orderedSame){
print("voila")
}
a.caseInsensitiveCompare(b) == ComparisonResult.orderedSame
caseInsensitiveCompare(_:)
는 Swift Standard Library에 포함되어 있지 않고 Foundation
프레임 워크의 일부 이므로 import Foundation
.
a.lowercased() == b.lowercased()
있습니까?
사용 caseInsensitiveCompare
방법 :
let a = "Cash"
let b = "cash"
let c = a.caseInsensitiveCompare(b) == .orderedSame
print(c) // "true"
ComparisonResult 는 사전 식 순서로 다른 단어보다 먼저 오는 단어를 알려줍니다 (즉, 사전의 앞쪽에 더 가까운 단어). .orderedSame
문자열이 사전의 동일한 위치에 있음을 의미합니다.
.orderedSame
문자열이 사전의 같은 위치에 끝날 것임을 의미합니다.
.orderedSame
대한 짧은 ComparisonResult.orderSame
컴파일러가 알고 있기 때문에 당신이 유형의 이름을 필요가 없습니다 ... caseInsensitiveCompare
리턴을 ComparisonResult
. "두 피연산자는 같음"-특정 순서에 따라 동일합니다. "현금"과 "현금"은 동일한 문자열 값이 아닙니다. "하지만 여기서 '주문'이라는 단어가 사용 된 이유는 무엇입니까?" -정렬 된 비교의 결과이기 때문입니다. 다른 값은 다음 orderedAscending
과 orderedDescending
그냥 동일하거나 서로 다른의 문제가 아니다 .... "작은"에 관해서 : 문자열은 큰 밑의 숫자와 같습니다.
a.caseInsensitiveCompare(b, comparing: .orderedSame)
... 더 읽기했을
if a.lowercaseString == b.lowercaseString {
//Strings match
}
올바른 방법 :
let a: String = "Cash"
let b: String = "cash"
if a.caseInsensitiveCompare(b) == .orderedSame {
//Strings match
}
참고 : ComparisonResult.orderedSame은 약어로 .orderSame으로 작성할 수도 있습니다.
다른 방법들:
ㅏ.
if a.lowercased() == b.lowercased() {
//Strings match
}
비.
if a.uppercased() == b.uppercased() {
//Strings match
}
씨.
if a.capitalized() == b.capitalized() {
//Strings match
}
직접 굴릴 수 있습니다.
func equalIgnoringCase(a:String, b:String) -> Bool {
return a.lowercaseString == b.lowercaseString
}
localizedCaseInsensitiveContains : 대소 문자를 구분하지 않고 로케일을 인식하는 검색을 수행하여 수신자가 주어진 문자열을 포함하는지 여부를 리턴합니다.
if a.localizedCaseInsensitiveContains(b) {
//returns true if a contains b (case insensitive)
}
편집 :
caseInsensitiveCompare : NSCaseInsensitiveSearch를 유일한 옵션으로하여 compare (_ : options :)를 호출 한 결과를 반환합니다.
if a.caseInsensitiveCompare(b) == .orderedSame {
//returns true if a equals b (case insensitive)
}
또한 모든 문자를 대문자 (또는 소문자)로 만들고 동일한 지 확인할 수 있습니다.
var a = “Cash”
var b = “CASh”
if a.uppercaseString == b.uppercaseString{
//DO SOMETHING
}
이렇게하면 두 변수가 모두 ”CASH”
같으므로 동일합니다.
String
연장 할 수도 있습니다.
extension String{
func equalsIgnoreCase(string:String) -> Bool{
return self.uppercaseString == string.uppercaseString
}
}
if "Something ELSE".equalsIgnoreCase("something Else"){
print("TRUE")
}
Swift 4에서는 caseInsensitiveCompare ()를 템플릿으로 사용하여 문자열 확장 경로를갔습니다 (그러나 피연산자가 선택 사항이 될 수 있음). 여기에 제가 함께 사용했던 플레이 그라운드가 있습니다.
import UIKit
extension String {
func caseInsensitiveEquals<T>(_ otherString: T?) -> Bool where T : StringProtocol {
guard let otherString = otherString else {
return false
}
return self.caseInsensitiveCompare(otherString) == ComparisonResult.orderedSame
}
}
"string 1".caseInsensitiveEquals("string 2") // false
"thingy".caseInsensitiveEquals("thingy") // true
let nilString1: String? = nil
"woohoo".caseInsensitiveEquals(nilString1) // false
.orderedSame
대신 사용할 수 있습니다 ComparisonResult.orderedSame
.
Swift 3 : 고유 한 연산자를 정의 할 수 있습니다 (예 : ~=
.
infix operator ~=
func ~=(lhs: String, rhs: String) -> Bool {
return lhs.caseInsensitiveCompare(rhs) == .orderedSame
}
그런 다음 놀이터에서 시도해 볼 수 있습니다.
let low = "hej"
let up = "Hej"
func test() {
if low ~= up {
print("same")
} else {
print("not same")
}
}
test() // prints 'same'
String
인스턴스를 서로 (또는 다른 String
리터럴) 일치시킬 때 일반적으로 사용되는 기본 패턴 일치보다 우선하므로 일반적으로이 방법은 매우 나쁜 생각 입니다. let str = "isCAMELcase"
다음과 같은 케이스로 전환되는 경우를 상상해보십시오 case "IsCamelCase": ...
.. 위의 방법을 사용하면 case
성공적으로 입력 될 수 있으며 이는 String
패턴 일치 의 표준 libs 구현에서 오는 것이 아닙니다 . 업데이트 된 Swift 3 답변은 여전히 좋지만 ...
String
기본 String
패턴 일치를 재정의하는 대신 위의 도우미로 사용자 지정 함수 (또는 확장)를 사용하는 것이 좋습니다 .
extension String
{
func equalIgnoreCase(_ compare:String) -> Bool
{
return self.uppercased() == compare.uppercased()
}
}
사용 샘플
print("lala".equalIgnoreCase("LALA"))
print("l4la".equalIgnoreCase("LALA"))
print("laLa".equalIgnoreCase("LALA"))
print("LALa".equalIgnoreCase("LALA"))