2017-02-19 242 views
1

我正在玩弄一個接受用戶輸入的應用程序,並打印一個簡單的輸出。swift中不區分大小寫的switch語句?

我的代碼如下所示:

switch text { 
     case "Hi", "hi", "Hello", "hello", "Good day", "good day": 
      return "Hello, sir." 
     default: 
      return "Sorry, I didn't understand!" 
} 

我的問題是不是有一個輸出5-10可能的輸入,是有可能把一個輸入是不區分大小寫?例如,我可以只是把「你好」,並有我的聲明檢查「你好」,「你好」,「你好」等?

+4

'switch text.lowercased()'並在'switch'語句的不同情況下輸入小寫字符串。請注意,某些特殊字符在應用'lowercased()'或'uppercased()'時不會像預期的那樣翻譯:請參閱以下問答內容(http://stackoverflow.com/questions/30532728)/how-to-compare-two-strings-ignored-case-in-swift-language)(特別是對問題的評論)。 – dfri

回答

4

你可以大寫text(或小寫[lowercased()]作爲在評論中提到的),這樣的情況下不會有問題:

switch text.uppercased() { 
case "HI", "HELLO", "GOOD DAY": 
    return "Hello, sir." 
default: 
    return "Sorry, I didn't understand!" 
} 
+0

謝謝!我沒有想到這一點! –

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 
} 
+2

請注意,每當您發現自己使用諸如'... first(where:...)!= nil'等語句時,尋找一些元素給出了一些謂詞,但_不使用這個element_,你可以簡單地使用'contains(where:...)'來代替。例如上面的'return strings.contains(其中:{$ 0.lowercased()== input.lowercased()})'。但是,由於您沒有應用模式匹配,所以沒有理由不使用現有的不區分大小寫的比較工具(這裏來自'Foundation'):例如'return strings.contains(其中:{$ 0.caseInsensitiveCompare(input)== .orderedSame})'。 – dfri

3

最優雅的解決辦法應該使用較少知名的String.CompareOptions結合.range(of:, options:)。這允許您以較少的努力執行復雜的操作,例如匹配忽略特殊字符,而不僅僅是案例和使用正則表達式(這對於您的特定目的會很有利)。如果你不知道它們是什麼,我建議你看看它。

返回專題: 您可以閱讀更多關於String.CompareOptionshere。該文檔適用於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ö比賽helloGreetings因爲greeting.caseInsensitive.diacriticInsensitive匹配。

如果您不熟悉.filter運算符,它會遍歷您的數組,並且對於每個項目word,都希望您返回true或false,具體取決於項目是否應包含在您的過濾版本中陣列。這通過比較.range(of:, options:)nil的結果來完成。不等號nil表示找到該單詞,如果不是,則等於零。你當然可以使用該範圍,如果你想知道其中這個詞被發現。

+0

如果我們想結合幾個比較選項,這種方法很好,但我相信使用['比較(_:options:)'](https://developer.apple.com/reference/foundation/nsstring/1410893-compare)和測試vs'.orderedSame'具有更好的語義(在這種情況下)比'range(...)'測試vs非'nil'(因爲在這種情況下,我們實際上並沒有使用可選產生的範圍通過調用'range(of:options:)')。 – dfri

+0

是的,你是對的。它最終歸結爲相同的。對我來說重要的是使用'options',特別是'.diacriticInsensitive',否則這將非常難以實現('.caseInsensitive'非常簡單)。 –

+0

我希望他們實現'contains(_:options:)'在比較簡單,清潔的Bool函數中使用比較選項。 –