我正在玩一个接受用户输入的应用程序,并打印一个简单的输出。
我的代码如下所示:
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"等等?
答案 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ö
和hello
,Greetings
匹配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
}