Как проверить, содержит ли строка строки в Swift?
Я пытаюсь проверить, содержит ли конкретная строка буквы или нет.
До сих пор я встречал NSCharacterSet.letterCharacterSet()
как набор букв, но мне не удается проверить, находится ли символ в этом наборе в данной строке. Когда я использую этот код, я получаю сообщение об ошибке:
'Character' не конвертируется в 'unichar'
Для следующего кода:
for chr in input{
if letterSet.characterIsMember(chr){
return "Woah, chill out!"
}
}
Ответы
Ответ 1
Вы можете использовать NSCharacterSet
следующим образом:
let letters = NSCharacterSet.letterCharacterSet()
let phrase = "Test case"
let range = phrase.rangeOfCharacterFromSet(letters)
// range will be nil if no letters is found
if let test = range {
println("letters found")
}
else {
println("letters not found")
}
Или вы тоже можете это сделать:
func containsOnlyLetters(input: String) -> Bool {
for chr in input {
if (!(chr >= "a" && chr <= "z") && !(chr >= "A" && chr <= "Z") ) {
return false
}
}
return true
}
В Swift 2:
func containsOnlyLetters(input: String) -> Bool {
for chr in input.characters {
if (!(chr >= "a" && chr <= "z") && !(chr >= "A" && chr <= "Z") ) {
return false
}
}
return true
}
Это зависит от вас, выбирайте способ. Надеюсь, это поможет вам.
Ответ 2
Вы должны использовать String
встроенные функции диапазона с NSCharacterSet
, а не сворачивать свое собственное решение. Это также даст вам гораздо больше гибкости (например, если вы не хотите, чтобы поиск не зависел от регистра).
let str = "Hey this is a string"
let characterSet = NSCharacterSet(charactersInString: "aeiou")
if let _ = str.rangeOfCharacterFromSet(characterSet, options: .CaseInsensitiveSearch) {
println("true")
}
else {
println("false")
}
Замените "aeiou"
на любые буквы, которые вы ищете.
Менее гибкая, но забавная быстрая заметка, тем не менее, заключается в том, что вы можете использовать любую из функций, доступных для Sequence
s. Итак, вы можете сделать это:
contains("abc", "c")
Это, конечно, будет работать только для отдельных персонажей и не является гибким и не рекомендуется.
Ответ 3
Проблема с .characterIsMember
заключается в том, что требуется unichar
(typealias для UInt16
).
Если вы повторяете свой ввод, используя представление utf16
строки, оно будет работать:
let set = NSCharacterSet.letterCharacterSet()
for chr in input.utf16 {
if set.characterIsMember(chr) {
println("\(chr) is a letter")
}
}
Вы также можете пропустить цикл и использовать алгоритм contains
, если вы хотите проверить наличие/отсутствие:
if contains(input.utf16, { set.characterIsMember($0) }) {
println("contains letters")
}