簡體   English   中英

swift中不區分大小寫的switch語句?

[英]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而匹配helloGreetings匹配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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM