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

Eri*_*ips 3 switch-statement swift

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

我的代码看起来像这样:

switch text {
        case "Hi", "hi", "Hello", "hello", "Good day", "good day":
            return "Hello, sir."
        default:
            return "Sorry, I didn't understand!"
}
Run Code Online (Sandbox Code Playgroud)

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

Kev*_*off 7

您可以使用大写text(或lowercased()注释中提到的小写[ ]),因此大小写无关紧要:

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


小智 5

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

返回主题:您可以String.CompareOptions 在此处阅读更多相关信息。该文档适用于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"]
Run Code Online (Sandbox Code Playgroud)

如您所见,HeLLö匹配helloGreetings匹配greeting因为.caseInsensitive.diacriticInsensitive

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