2017-11-26 13 views
1

Swift에서 대소 문자가없는 문자열을 비교하는 다음과 같은 방법간에 차이가 있습니까? 대대소 문자가 불 일치하는 문자열 비교

let equal = str1.lowercased() == str2.lowercased() // or uppercased() 

하나는 잘못된 결과를 반환하는 모든 언어로 어떤 경우는

let equal = str1.caseInsensitiveCompare(str2) == .orderedSame 

있습니까? 성능보다 유니 코드 정확성에 더 관심이 있습니다.

+0

caseInsensitiveCompare''에 대한 호출이 궁극적으로 아래로 떨어지면 [CFString의 CFStringCompareWithOptionsAndLocale] (https://github.com/apple/swift-corelibs-foundation/blob/e48175bca494b8a6dc22079af42dbd66c0805eda/CoreFoundation/String.subproj/CFString.c#L2553) 'kCFCompareCaseInsensitive'를 사용하십시오. 통찰력을 얻기 위해 주변의 논리를 볼 수도 있습니다. – Undo

답변

0

두 가지 모두 똑같은 기능을합니다. lowercased() 또는 uppercased()은 유니 코드 문자에 영향을 미치지 않으므로 비교시 최종 결과가 항상 다른 문자열과 일치합니다.

이 방법은 그림 이모티콘을 포함한 모든 유형의 특수 문자를 지원합니다.

동일 내용은 caseInsensitiveCompare과 동일합니다. 이것도 역시 특수 문자, 기호 등을 무시합니다.

+0

"유니 코드 문자에 영향을 미치지 않습니다"는 의미는 무엇입니까? 예를 들어 'é'는 '대문자'로 'É'로 변환합니다. 또한, "특수 문자, 기호 등을 무시할 것"이란 무엇을 의미합니까? 나는'caseInsensitiveCompare'가 어떤 문자도 무시할 것이라고 생각하지 않는다. 그래서 나는 당신이 말하는 것을 이해하는지 모르겠다. – Rob

+1

좋아요, 당신이 말하는 것을 보았습니다. 유니 코드 문자 자체에 영향을 미치지 않는다는 말은 아니며 (예상 할 수있는 것처럼) 최종 결과는 항상 일치합니다. 아주 좋아. – Rob

0

caseInsensitiveCompare은 훨씬 효율적입니다. (일상적인 사용에서 볼 수 있다면 충격을 받겠지 만). 그리고 IMHO, 그것은 의도에 대해보다 직관적입니다.

"유니 코드 정확성"에 관해서는, 나는 그것이 당신이 의미하는 것에 달려 있다고 생각합니다. 예를 들어, "Straße"와 "strasse"를 비교하면 caseInsensitiveCompare은 동일하다고 말하지만 lowercased 접근 방식은 그렇지 않습니다 (단 uppercased).

하지만 스위프트 4 "\u{65}\u{301}""\u{E9}" 비교하면 (WWDC 2017 What's New in Swift에서 유니 코드 정확성의 설명을 참조), 둘 다 제대로 인식하는 사람들은 é 그리고 그들은 그 두 문자열이 서로 다른에도 불구하고, 같은 것 말 것 유니 코드 스칼라의 수.