Как проверить, содержит ли строка строки в 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")
}