Ответ 1
Я понимаю, что unichar
является typealias для UInt16
. A unichar
- это просто число.
Я думаю, что проблема, с которой вы сталкиваетесь, заключается в том, что Character
в Swift может состоять из нескольких символов "Юникод". Таким образом, он не может быть преобразован в одно значение unichar
, поскольку он может состоять из двух unichars. Вы можете разложить Character
на свои индивидуальные значения unichar
, переведя его в строку и используя свойство utf16
, например:
let c: Character = "a"
let s = String(c)
var codeUnits = [unichar]()
for codeUnit in s.utf16 {
codeUnits.append(codeUnit)
}
Это приведет к созданию массива - codeUnits
- значений unichar
.
EDIT: начальный код имел 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
Теперь сделайте проверку функции для всех значений 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" ), так и комбинирующего символа (острый акцент) в наборе символов или вы получите ложные срабатывания.