Character
s может быть создан от String
до тех пор, пока те String
s состоят только из одного символа. И, поскольку Character
реализует ExtendedGraphemeClusterLiteralConvertible
, Swift сделает это автоматически для вас при назначении. Таким образом, чтобы создать в Swift в Character
, вы можете просто сделать что-то вроде:
let ch: Character = "a"
Затем вы можете использовать contains
метод в IntervalType
(генерируемый с Range
operators), чтобы проверить, если персонаж находится в пределах диапазона вы «повторно ищет:
if ("a"..."z").contains(ch) {
/* ... whatever ... */
}
Пример:
let ch: Character = "m"
if ("a"..."z").contains(ch) {
println("yep")
} else {
println("nope")
}
Выходы:
да
Update: Как @MartinR отметил, упорядоченность символов Swift основана на Unicode Normalization Form D, который в том же порядке, как коды ASCII символов не. В вашем конкретном случае есть больше символов между a
и z
, чем в прямом ASCII (например, ä
). См. Ответ @ MartinR here для получения дополнительной информации.
Если вам нужно проверить, находится ли символ между двумя символьными кодами ASCII, вам может понадобиться сделать что-то вроде вашего обходного пути.Тем не менее, вы также должны преобразовать ch
к unichar
, а не Character
для его работы (см this question для получения дополнительной информации о Character
против unichar
):
let a_code = ("a" as NSString).characterAtIndex(0)
let z_code = ("z" as NSString).characterAtIndex(0)
let ch_code = (String(ch) as NSString).characterAtIndex(0)
if (a_code...z_code).contains(ch_code) {
println("yep")
} else {
println("nope")
}
Или, еще более многословным способом без использования NSString
:
let startCharScalars = "a".unicodeScalars
let startCode = startCharScalars[startCharScalars.startIndex]
let endCharScalars = "z".unicodeScalars
let endCode = endCharScalars[endCharScalars.startIndex]
let chScalars = String(ch).unicodeScalars
let chCode = chScalars[chScalars.startIndex]
if (startCode...endCode).contains(chCode) {
println("yep")
} else {
println("nope")
}
Примечание: Оба эти примеры работают только тогда, когда символ содержит только одну кодовую точку, но, до тех пор, как мы ограничены A SCII, это не должно быть проблемой.
Обратите внимание, что порядок строк или символов Swift не основан на коде ASCII (сравните http://stackoverflow.com/a/25775112/1187415). Например, '" a "..." z "' содержит символ "ä". Это может быть желательно или нет. –
@MartinR Спасибо, я этого не осознал. Я обновил ответ с этой информацией. –
Это хороший трюк, который я буду держать в банке для других видов логики. Тем не менее, это немного высокий уровень: когда дело доходит до синтаксического анализа формата char-by-char, где производительность имеет значение как точность, нет никакой возможности для того, чтобы быть в состоянии идти туда и обратно между int-like и строковым представлением характер. Так что char-literal все еще необходим. –