2017-11-26 13 views
1

Swiftで大文字と小文字を区別しない文字列を比較する方法には違いがありますか?対大文字小文字の区別がない文字列の比較

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

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

1は誤った結果を返す任意の言語でどのような場合はありますか? 私は、パフォーマンスよりもUnicodeの正確さに関心があります。

+0

caseInsensitiveCompare' 'の呼び出しが最終的に落下【のCFStringのCFStringCompareWithOptionsAndLocale(https://github.com/apple/swift-corelibs-foundation/blob/e48175bca494b8a6dc22079af42dbd66c0805eda/CoreFoundation/String.subproj/CFString.c#L2553) 'kCFCompareCaseInsensitive'を指定します。あなたはその周辺の洞察のための論理を見るかもしれません。 – Undo

答えて

0

どちらも同じことですが、lowercased()またはuppercased()はUnicode文字に影響しないため、比較すると最終結果は常に他の文字列と一致します。

これらのメソッドは、絵文字アイコンを含むすべての種類の特殊文字をサポートしています。

同義語はcaseInsensitiveCompareとなります。これも特殊文字、記号などを無視します。

+0

「Unicode文字に影響しません」とはどういう意味ですか?たとえば、 'é'は'大文字で 'É'に変換されます。また、「特殊文字や記号などは無視しますか?」とはどういう意味ですか?私は 'caseInsensitiveCompare'が文字を無視するとは思わないので、あなたが何を言っているのか分かりません。 – Rob

+1

よろしくお願いします。ユニコード文字自体には影響しないと言っているわけではありませんが、単に「最終結果は常に一致します」ということです。とても良い。 – Rob

0

caseInsensitiveCompareは、はるかに効率的です(ただし、毎日の通常の使用で観察可能ならばショックを受けます)。そして、IMHO、それは意図に関してより直観的です。

「ユニコードの正確さ」に関して、私はそれがあなたが意味するものに依存すると思います。たとえば、「Straße」と「strasse」を比較すると、caseInsensitiveCompareは同じであると言いますが、lowercasedのアプローチはありません(ただし、uppercasedになります)。

しかし、あなたは(WWDC 2017 What's New in SwiftにおけるUnicodeの正当性の議論を参照)スウィフト4に"\u{65}\u{301}""\u{E9}"を比較する場合、それらの両方が正しく、これらは、これら2つの文字列が異なる持っているにもかかわらず、éであり、彼らが同じだと言うだろうことを認識ユニコードスカラーの数。

関連する問題