Самое элегантное решение следует использовать меньшее количество 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
. Unequal nil
означает, что слово было найдено, равное nil, если нет. Для детальной конкретной информации о , там, где было установлено, что данное слово найдено.
'switch text.lowercased()' и введите строки с нижним регистром только в разных случаях вашего оператора 'switch'. Просто обратите внимание, что некоторые специальные символы не переводятся, как можно было бы ожидать при применении 'lowercased()' или 'uppercased()' к ним: см. [Следующие вопросы и ответы для деталей] (http://stackoverflow.com/questions/30532728/how-to-compare-two-strings-ignoring-case-in-swift-language) (в частности, комментарии к вопросу). – dfri