Как узнать, является ли буква буквенно-цифровая или цифра в Swift
Я хочу посчитать количество букв, цифр и специальных символов в следующей строке:
let phrase = "The final score was 32-31!"
Я пытался:
for tempChar in phrase {
if (tempChar >= "a" && tempChar <= "z") {
letterCounter++
}
// etc.
но я получаю ошибки. Я пробовал всевозможные другие варианты - все еще получаю ошибку - например:
не удалось найти перегрузку для '& lt; =', которая принимает предоставленные аргументы
Ответы
Ответ 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)"#);