入力された文字列に対して、全角半角、大文字小文字の相互変換、また頭文字だけ大文字に変換したいという状況はよくあると思います。私がよく使うParse Queryではデフォルトで大文字と小文字の判定を行わないため、結構面倒なことになったりします。例えばDBの値が「Poker」のとき「poker」で検索するとヒットしなかったりします。詳しくはわかりませんけど大文字小文字の判定するのってParse Query独自の仕様なんでしょうか。とりあえず結構困るので下記のようなメソッドを用意して適宜変換して対応することにします。(Swift2.x系で動作確認)
Contents
入力された文字をすべて大文字に変換する
1 2 3 |
func convertLowerToUpper(str:String) ->String { return str.uppercaseString } |
入力された文字をすべて小文字に変換する
1 2 3 |
func convertUpperToLower(str:String) ->String { return str.lowercaseString } |
半角文字を全角文字に変換する
1 2 3 4 5 |
func convertHalfToFull(str:String) -> String { let str = NSMutableString(string: str) as CFMutableString CFStringTransform(str, nil, kCFStringTransformFullwidthHalfwidth, false) return str as String } |
全角文字を半角文字に変換する
1 2 3 4 5 |
func convertFullToHalf(str:String) -> String { let str = NSMutableString(string: str) as CFMutableString CFStringTransform(str, nil, kCFStringTransformFullwidthHalfwidth, true) return str as String } |
入力された単語の先頭だけ大文字にする
1 2 3 4 |
func capitalizingFirstLetter(str:String) -> String { let strLower = convertUpperToLower(str) return String(strLower.characters.prefix(1)).uppercaseString + String(strLower.characters.dropFirst()) } |
ひとつひとつ指定して変換するのも面倒なのでその場合は、こういう風にメソッドをまとめてしまって結果を配列で受け取ると便利です。受け取った内容ごとにOR条件で検索をかけてあげれば結構ゆるい感じの結果が返ってくると思います。
まとめてみる
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
func getConvertedStringList(str:String) ->[String] { var strList:[String] = [] // 1. オリジナル文字列 strList.append(str) // 2. オリジナルをすべて全角に変換した文字列 strList.append(convertHalfToFull(str)) // 3. オリジナルをすべて半角に変換した文字列 strList.append(convertFullToHalf(str)) // 4. オリジナルをすべて全角かつ大文字に変換した文字列 strList.append(convertLowerToUpper(convertHalfToFull(str))) // 5. オリジナルをすべて全角かつ小文字に変換した文字列 strList.append(convertUpperToLower(convertHalfToFull(str))) // 6. オリジナルをすべて半角かつ大文字に変換した文字列 strList.append(convertLowerToUpper(convertFullToHalf(str))) // 7. オリジナルをすべて半角かつ小文字に変換した文字列 strList.append(convertUpperToLower(convertFullToHalf(str))) // 8. オリジナルをすべて全角かつ先頭の文字だけ大文字に変換した文字列 strList.append(capitalizingFirstLetter(convertHalfToFull(str))) // 9. オリジナルをすべて半角かつ先頭の文字だけ大文字に変換した文字列 strList.append(capitalizingFirstLetter(convertFullToHalf(str))) return strList } |
実際に実行するとこうなります
1 2 3 4 |
let org = "texasHold'emPoker" for str in getConvertedStringList(org) { print(str) } |
texasHold’emPoker
texasHold’emPoker
texasHold'emPoker
TEXASHOLD’EMPOKER
texashold’empoker
TEXASHOLD'EMPOKER
texashold'empoker
TexasHold’emPoker
TexasHold'emPoker
このくらいのパターンを網羅すればユーザの入力値の揺れにも対応出来るかなと思います。