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

Какая замена для isDigit() для символов в Swift?

Как упоминалось в этом сообщении, перед Xcode 6 Beta 4 можно было использовать c.isDigit() и c.isAlpha(), чтобы найти, если c : Character была цифрой или альфа, В сообщении упоминается, что это было удалено, поскольку оно было эффективным только для символов ASCII.

Мой вопрос в том, что замена? Не удалось настроить функцию с помощью оператора switch для буквенно-цифровых опций, как я могу проверить символ на его цифре?

4b9b3361

Ответ 1

"Проблема" заключается в том, что символ Swift не соответствует Unicode кодовой точки, но представляет собой "расширенный кластер графемы", который может состоять из несколько сканеров Unicode. Например

let c : Character = "🇺🇸" // REGIONAL INDICATOR SYMBOL LETTERS US

- фактически последовательность двух сканеров Unicode.

Если мы проигнорируем этот факт, вы можете получить начальный сканер Unicode character (compare Как получить кодовую точку (символы) Unicode символа?) и проверить ее принадлежность в наборе символов:

let c : Character = "5"

let s = String(c).unicodeScalars
let uni = s[s.startIndex]

let digits = NSCharacterSet.decimalDigitCharacterSet()
let isADigit = digits.longCharacterIsMember(uni.value)

Это возвращает "true" для символов "0"... "9", но фактически для всех Сканеры Unicode "десятичная разрядная категория" , например:

let c1 : Character = "৯" // BENGALI DIGIT NINE U+09EF
let c2 : Character = "𝟙" // MATHEMATICAL DOUBLE-STRUCK DIGIT ONE U+1D7D9

Если вам нужны только цифры (ASCII) "0"... "9", тогда самый простой способ:

if c >= "0" && c <= "9" { }

или, используя диапазоны:

if "0"..."9" ~= c { }

Ответ 2

Swift 3 выглядит немного проще:

let str = "abcdef12345"
let digitSet = CharacterSet.decimalDigits

for ch in str.unicodeScalars {
    if digitSet.contains(ch) {
        // is digit!
    }
}

Ответ 3

О Swift 3:

По словам великого Мартина R, для тех, у кого проблемы с новым быстрым:

заменить:

let digits = NSCharacterSet.decimalDigitCharacterSet()

с:

let digits = NSCharacterSet.decimalDigits as NSCharacterSet

Ответ 4

Для одного символа:

CharacterSet.decimalDigits.contains(string.unicodeScalars.first!)