我的理解是unichar 是UInt16 的类型别名。 unichar 只是一个数字。
我认为您面临的问题是 Swift 中的 Character 可以由多个 unicode“字符”组成。因此,它不能转换为单个 unichar 值,因为它可能由两个 unichars 组成。您可以通过将 Character 转换为字符串并使用 utf16 属性将其分解为单独的 unichar 值,如下所示:
let c: Character = "a"
let s = String(c)
var codeUnits = [unichar]()
for codeUnit in s.utf16 {
codeUnits.append(codeUnit)
}
这将产生一个数组 - codeUnits - unichar 值。
编辑:初始代码有for codeUnit in s,而它应该是for codeUnit in s.utf16
您可以整理并测试每个 unichar 值是否在这样的字符集中:
let char: Character = "\u{63}\u{20dd}" // This is a 'c' inside of an enclosing circle
for codeUnit in String(char).utf16 {
if NSCharacterSet(charactersInString: "c").characterIsMember(codeUnit) {
dude.abide()
} // dude will abide() for codeUnits[0] = "c", but not for codeUnits[1] = 0x20dd (the enclosing circle)
}
或者,如果您只对第一个(通常也是唯一的)unichar 值感兴趣:
if NSCharacterSet(charactersInString: "c").characterIsMember(String(char).utf16[0]) {
dude.abide()
}
或者,将其包装在一个函数中:
func isChar(char: Character, inSet set: NSCharacterSet) -> Bool {
return set.characterIsMember(String(char).utf16[0])
}
let xSet = NSCharacterSet(charactersInString: "x")
isChar("x", inSet: xSet) // This returns true
isChar("y", inSet: xSet) // This returns false
现在让函数检查组合字符中的 all unichar 值 - 这样,如果您有组合字符,则函数仅在基本字符和组合字符都返回 true 时字符存在:
func isChar(char: Character, inSet set: NSCharacterSet) -> Bool {
var found = true
for ch in String(char).utf16 {
if !set.characterIsMember(ch) { found = false }
}
return found
}
let acuteA: Character = "\u{e1}" // An "a" with an accent
let acuteAComposed: Character = "\u{61}\u{301}" // Also an "a" with an accent
// A character set that includes both the composed and uncomposed unichar values
let charSet = NSCharacterSet(charactersInString: "\u{61}\u{301}\u{e1}")
isChar(acuteA, inSet: charSet) // returns true
isChar(acuteAComposed, inSet: charSet) // returns true (both unichar values were matched
最后一个版本很重要。如果您的Character 是组合字符,则必须检查字符集中是否存在基本字符(“a”)和组合字符(重音符号),否则会出现误报。