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个可能的输入,是否可以放置一个不区分大小写的输入?例如,我可以只是把"你好",并让我的声明检查"你好","你好","你好"等?
您可以使用大写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ö匹配hello和Greetings匹配greeting因为.caseInsensitive和.diacriticInsensitive。
如果您不熟悉该.filter运算符,它会遍历您的数组,并且对于每个 item word,期望您返回 true 或 false,具体取决于该项目是否应包含在您的数组的过滤版本中。这是通过比较.range(of:, options:)to的结果来完成的nil。Unequalnil表示找到了这个词,如果没有,则等于 nil。如果您想知道在何处找到该词,您当然可以使用范围。