Подтвердить что ты не робот

Как узнать, является ли буква буквенно-цифровая или цифра в Swift

Я хочу посчитать количество букв, цифр и специальных символов в следующей строке:

let phrase = "The final score was 32-31!"

Я пытался:

for tempChar in phrase {
    if (tempChar >= "a" && tempChar <= "z") {
       letterCounter++
    }
// etc.

но я получаю ошибки. Я пробовал всевозможные другие варианты - все еще получаю ошибку - например:

не удалось найти перегрузку для '& lt; =', которая принимает предоставленные аргументы

4b9b3361

Ответ 1

Обновление для Swift 3:

let letters = CharacterSet.letters
let digits = CharacterSet.decimalDigits

var letterCount = 0
var digitCount = 0

for uni in phrase.unicodeScalars {
    if letters.contains(uni) {
        letterCount += 1
    } else if digits.contains(uni) {
        digitCount += 1
    }
}

(Предыдущий ответ для более старых версий Swift)

Возможное решение Swift:

var letterCounter = 0
var digitCount = 0
let phrase = "The final score was 32-31!"
for tempChar in phrase.unicodeScalars {
    if tempChar.isAlpha() {
        letterCounter++
    } else if tempChar.isDigit() {
        digitCount++
    }
}

Обновление: вышеуказанное решение работает только с символами в наборе символов ASCII, то есть он не распознает буквы Ä, é или ø. Следующая альтернатива Решение использует NSCharacterSet из основы Foundation, который может тестировать символы на основе их классов символов Unicode:

let letters = NSCharacterSet.letterCharacterSet()
let digits = NSCharacterSet.decimalDigitCharacterSet()

var letterCount = 0
var digitCount = 0

for uni in phrase.unicodeScalars {
    if letters.longCharacterIsMember(uni.value) {
        letterCount++
    } else if digits.longCharacterIsMember(uni.value) {
        digitCount++
    }
}

Обновление 2: Начиная с Xcode 6 beta 4, первое решение больше не работает, потому что isAlpha() и связанные с ним (только для ASCII) методы были удалены из Swift. Второе решение все еще работает.

Ответ 2

Используйте значения unicodeScalars

let phrase = "The final score was 32-31!"
var letterCounter = 0, digitCounter = 0
for scalar in phrase.unicodeScalars {
    let value = scalar.value
    if (value >= 65 && value <= 90) || (value >= 97 && value <= 122) {++letterCounter}
    if (value >= 48 && value <= 57) {++digitCounter}
}
println(letterCounter)
println(digitCounter)

Ответ 3

Я создал короткое расширение для количества букв и цифр для String

extension String {
  var letterCount : Int {
    return self.unicodeScalars.filter({ CharacterSet.letters.contains($0) }).count
  }

  var digitCount : Int {
   return self.unicodeScalars.filter({ CharacterSet.decimalDigits.contains($0) }).count
  }
}

или функция для подсчета любого CharacterSet, который вы вставили в

extension String {    
  func characterCount(for set: CharacterSet) -> Int {
    return self.unicodeScalars.filter({ set.contains($0) }).count
  }
}

использование:

let phrase = "the final score is 23-13!"
let letterCount = phrase.characterCount(for: .letters)

Ответ 4

Для Swift 5 вы можете сделать следующее для простых строк, но будьте бдительны в отношении обработки символов, таких как "1️⃣", "④", они также будут рассматриваться как числа.

let phrase = "The final score was 32-31!"

var numberOfDigits = 0;
var numberOfLetters = 0;
var numberOfSymbols = 0;

phrase.forEach {

    if ($0.isNumber) {
        numberOfDigits += 1;
    }
    else if ($0.isLetter)  {
        numberOfLetters += 1
    }
    else if ($0.isSymbol || $0.isPunctuation || $0.isCurrencySymbol || $0.isMathSymbol) {
        numberOfSymbols += 1;
    }
}

print(#"\#(numberOfDigits)  || \#(numberOfLetters) || \#(numberOfSymbols)"#);