2017-02-19 1 views
1

나는 사용자 입력을 받아들이고 간단한 출력을 출력하는 앱으로 놀고있다.대소 문자를 구분하지 않는 switch 문은 신속하게?

내 코드는 다음과 같습니다

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

내 질문 대신 하나 개의 출력 5-10 가능한 입력을 필요없이, 그것은 대소 문자를 구분하지 않습니다 하나 개의 입력을 넣을 수 있습니까? 예를 들어, 그냥 "hello"를 넣고 "Hello", "hello", "HELLO"등 내 문장을 점검 할 수 있습니까?

+4

'switch text.lowercased()'와'switch' 문의 다른 경우에 lowercased-only 문자열을 입력하십시오. 'lowercased()'또는'uppercased()'를 적용 할 때 예상 할 수있는 것처럼 일부 특수 문자는 번역되지 않는다는 점에주의하십시오 : 자세한 내용은 다음 Q & A를 참조하십시오 (http://stackoverflow.com/questions/30532728)./how-to-compare-two-strings-ignore-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'과 같은 문구를 사용할 때마다 어떤 술어가 주어진 몇몇 요소를 찾고 있지만 그 요소를 사용하지 않는다면 대신에 contains (where : ...)를 사용할 수 있습니다. 예 : 위의 'return strings.contains (여기서 : {$ 0.lowercased() == input.lowercased()})'. 그러나 패턴 매칭을 적용하지 않으므로 이미 사용 가능한 대/소문자 구분 도구 ('Foundation'에서 제공)를 사용하지 않아도됩니다. 'return strings.contains (여기서 : $ 0.caseInsensitiveCompare (입력) == .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ö 일치 greeting 때문에 .caseInsensitive.diacriticInsensitivehelloGreetings 일치 다음과 같이

당신은 다음을 사용할 수 있습니다.

.filter 연산자에 익숙하지 않은 경우 배열을 반복하고 각 항목 word에 대해 항목이 필터링 된 버전에 포함되어야하는지 여부에 따라 true 또는 false를 반환 할 것으로 기대합니다. 정렬. 여기에 의 결과를 nil과 비교하면됩니다. 동일하지 않은 경우 nil은 단어가 발견되었음을 의미하고 그렇지 않은 경우에는 같음을 의미합니다. 을 알고 싶다면이라는 단어를 찾을 수있을 것입니다 만 물론 범위를 사용할 수 있습니다.

+0

여러 가지 비교 옵션을 결합하려면이 방법이 좋지만 [compare (_ : options :)'] (https://developer.apple.com/reference/foundation/nsstring/1410893-compare) (이 문맥에서)'range (...) '테스트와 non-'nil'을 비교할 때 (이 문맥에서 우리는 선택적으로 생성 된 범위를 실제로 사용하지 않기 때문에) 'range (of : options :)'를 호출함으로써). – dfri

+0

네, 맞습니다. 그것은 궁극적으로 동일하게 내려갑니다. 중요한 것은'options', 특별히'.diacriticInsensitive'를 사용하는 것입니다. 그렇지 않으면 구현하기가 극히 어려울 것입니다 ('.caseInsensitive'는 훨씬 간단합니다). –

+0

간단하고 깨끗한 Bool 함수에서 비교 옵션을 사용하기 위해'contains (_ : options :) '를 구현했으면합니다. –

관련 문제