String
中只包含一个字符时,可以通过它创建Character
。由于Character
实现了ExtendedGraphemeClusterLiteralConvertible
协议,Swift会在赋值时自动进行转换。因此,要在Swift中创建一个Character
,你可以直接执行类似以下代码的操作:
let ch: Character = "a"
然后,您可以使用IntervalType
的contains
方法(由Range
运算符生成)来检查字符是否在您要查找的范围内:
if ("a"..."z").contains(ch) {
}
例子:
let ch: Character = "m"
if ("a"..."z").contains(ch) {
println("yep")
} else {
println("nope")
}
输出:
yep
更新:正如@MartinR所指出的那样,Swift字符排序基于Unicode规范形式D,这与ASCII字符代码的顺序不同。在您特定的情况下,在a
和z
之间有更多的字符,而不是直接按ASCII码排序(例如ä
)。有关更多信息,请参见@MartinR的答案 这里。
如果您需要检查一个字符是否在两个ASCII字符代码之间,则可能需要做类似于原始解决方法的事情。但是,您还必须将ch
转换为unichar
而不是Character
才能使其工作(请参见此问题,了解有关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")
}
注意:这两个示例仅适用于字符只包含单个代码点的情况,但只要我们受限于ASCII,这不应该成为问题。