2017-02-19 30 views
1

私はユーザーの入力を受け取り、簡単な出力を印刷するアプリケーションで遊んでいます。大文字と小文字を区別しないswitch文は迅速に?

私のコードは次のようになります。

switch text { 
     case "Hi", "hi", "Hello", "hello", "Good day", "good day": 
      return "Hello, sir." 
     default: 
      return "Sorry, I didn't understand!" 
} 

私の質問は、代わりに1つの出力のための5-10可能な入力を有するので、大文字と小文字を区別していない1つの入力を置くことも可能ですか?たとえば、「hello」を入れ、「Hello」、「hello」、「HELLO」などの文をチェックすることはできますか?

+4

'switch text.lowercased()'と 'switch'ステートメントの異なるケースで小文字のみの文字列を入力します。特殊文字は 'lowercased()'や 'uppercased()'を適用するときに期待されるように翻訳されないことに注意してください:[詳細は以下のQ&Aを参照](http://stackoverflow.com/questions/30532728/how-to-compare-two-strings-ignore-case-in-swift-language)(特に質問に対するコメント) – dfri

答えて

4

(コメントで述べたように、または小文字の[lowercased()])あなたはtextを大文字ことができ、その場合はなりません問題:

switch text.uppercased() { 
case "HI", "HELLO", "GOOD DAY": 
    return "Hello, sir." 
default: 
    return "Sorry, I didn't understand!" 
} 
+0

ありがとう!私はそれを考えなかった! –

2

代替ソリューション:

func check(input: String) -> Bool { 
    let strings = ["Hi", "hi", "Hello", "hello", "Good day", "good day"] 

    let inputLowercase = input.lowercased() 
    return strings.first(where: { $0.lowercased() == inputLowercase }) != nil 
} 
+2

'... first(where:...)!= nil'のようなステートメントを使うと、いくつかの述語を与えられた要素を探していますが、その要素を使用していない_では、代わりに 'contains(where:...)'を使うことができます。たとえば、上記の 'return strings.contains(where:{$ 0lowercased()== input.lowercased()})'となります。しかし、パターンマッチングを適用していないので、既存の大文字と小文字を区別しない比較ツール(ここでは 'Foundation 'から)を使用しないでください: 'return strings.contains(where:{$ 0.caseInsensitiveCompare(input)== .orderedSame})'を返します。 – dfri

3

最もエレガントなソリューションですあまり知られていないString.CompareOptions.range(of:, options:)と組み合わせて使用​​してください。これにより、のように、特殊文字を無視して、大文字小文字のだけでなく、正規表現を使用するなど、少ない労力で多くの複雑な操作を行うことができます。彼らが何であるかわからないなら、それを調べることをお勧めします。トピックに戻る

: あなたはString.CompareOptionshereについての詳細を読むことができます。ドキュメントはNSStringですが、Stringでも利用できます。あなたが見ることができるように、

let userInput = "HeLLö, how are you doing? Greetings!" 

let acceptedWords = ["hello", "hi", "greeting"] 

var resultCommants = acceptedWords.filter { (word) -> Bool in 
    return userInput.range(of: word, options: [.caseInsensitive, .diacriticInsensitive]) != nil 
} 

// resultCommands = ["hello", "greeting"] 

HeLLö試合greetingため.caseInsensitive.diacriticInsensitivehelloGreetings試合:次のように

あなたはそれを使用します。

.filter演算子に精通していない場合は、配列全体を繰り返し処理し、各項目wordに対して、フィルタリングされたバージョンのアイテムに含まれるかどうかによってtrueまたはfalseのいずれかを返すことが期待されます。アレイ。ここでは、の結果とnilの結果を比較します。不一致nilは単語が見つかったことを意味し、そうでない場合は等しくなりません。 ここでという単語が見つかりましたかあなたはもちろん、範囲を使用することができます。

+0

複数の比較オプションを組み合わせたい場合、このアプローチは良いですが、[compare(_:options:) '](https://developer.apple.com/reference/foundation/nsstring/1410893-compare)テストとvs '.orderedSame'は' range(...) 'テストと' 'nil''以外のより良いセマンティクスを持っています(このコンテキストでは、オプションで生成される範囲を実際には使用しないので'range(of:options:)'を呼び出すことによって)。 – dfri

+0

はい、そうです。それは最終的に同じになる。私にとって重要なことは 'options'、特に' .diacriticInsensitive'を利用することです。そうしなければ実装が非常に難しくなります( '.caseInsensitive'はずっと簡単です)。 –

+0

より簡単でクリーンなBool関数でcompareオプションを使用するために 'contains(_:options:)'を実装したいと思います。 –

関連する問題