swift中不区分大小写的switch语句?

时间:2017-02-19 19:50:03

标签: swift switch-statement

我正在玩一个接受用户输入的应用程序,并打印一个简单的输出。

我的代码如下所示:

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

我的问题是,不是一个输出有5-10个可能的输入,是否可以输入一个不区分大小写的输入?例如,我可以把#34;你好"并让我的声明检查"你好","你好"," HELLO"等等?

3 个答案:

答案 0 :(得分:7)

你可以大写text(或评注中提到的小写[lowercased()],所以情况无关紧要:

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

答案 1 :(得分:4)

最优雅的解决方案是将鲜为人知的String.CompareOptions.range(of:, options:)结合使用。这使您可以轻松地执行更复杂的操作,例如匹配忽略特殊字符,不仅仅是大小写和使用正则表达式(这对您的特定用途非常有利)。如果你不知道它们是什么,我建议你研究一下。

返回主题: 您可以阅读有关String.CompareOptions here的更多信息。该文档适用于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öhelloGreetings匹配greeting.caseInsensitive匹配.diacriticInsensitive

如果您不熟悉.filter运算符,它会遍历您的数组,对于每个项目word,您希望返回true或false,具体取决于项目是否应该是包含在数组的过滤版本中。这是通过将.range(of:, options:)的结果与nil进行比较来完成的。不等nil表示找到的单词,如果没有则等于零。你当然可以使用范围,如果你想知道 这个单词的位置。

答案 2 :(得分: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
}