[英]Non-case-sensitive switch statement in swift?
我正在玩一個接受用戶輸入的應用程序,並打印一個簡單的輸出。
我的代碼看起來像這樣:
switch text {
case "Hi", "hi", "Hello", "hello", "Good day", "good day":
return "Hello, sir."
default:
return "Sorry, I didn't understand!"
}
我的問題是,不是一個輸出有5-10個可能的輸入,是否可以放置一個不區分大小寫的輸入? 例如,我可以只是把“你好”,並讓我的聲明檢查“你好”,“你好”,“你好”等?
您可以使用大寫text
(或注釋中提到的小寫[ lowercased()
],所以大小寫無關緊要:
switch text.uppercased() {
case "HI", "HELLO", "GOOD DAY":
return "Hello, sir."
default:
return "Sorry, I didn't understand!"
}
最優雅的解決方案是將較小的已知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"]
正如您所看到的, HeLLö
因為.caseInsensitive
和.diacriticInsensitive
而匹配hello
和Greetings
匹配greeting
。
如果您不熟悉.filter
運算符,它會遍歷您的數組,並且對於每個項目word
,都希望您返回true或false,具體取決於該項是否應包含在數組的過濾版本中。 在這里,這是通過比較的結果進行.range(of:, options:)
至nil
。 不nil
意味着找到了這個詞,如果沒有則等於零。 如果您想知道找到單詞的位置 ,您當然可以使用該范圍。
替代解決方案:
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
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.