Mein Verständnis ist, dass unichar
eine Typalias für UInt16
ist. A unichar
ist nur eine Nummer.
Ich denke, dass das Problem, das Sie gegenüberstellen, ist, dass ein Character
in Swift aus mehr als einem Unicode "Zeichen" bestehen kann. Daher kann es nicht in einen einzelnen unichar
Wert konvertiert werden, da er aus zwei Unichars bestehen kann. - codeUnits
- von unichar
Werte
let c: Character = "a"
let s = String(c)
var codeUnits = [unichar]()
for codeUnit in s.utf16 {
codeUnits.append(codeUnit)
}
Dies wird produzieren eine Reihe: Sie können durch Gießen in einen String und mit Hilfe der utf16
Eigenschaft, wie dies eine Character
in seine einzelnen unichar
Werte zersetzen.
EDIT: Initial Code hatte for codeUnit in s
wenn es for codeUnit in s.utf16
gewesen sein sollten Sie die Dinge und Prüfung für jeden einzelnen, ob oder nicht unichar
Wert ist in einem Character Set wie folgt ordentlich kann:
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)
}
Oder, wenn Sie nur an der ersten (und oft nur) unichar
Wert interessiert sind:
if NSCharacterSet(charactersInString: "c").characterIsMember(String(char).utf16[0]) {
dude.abide()
}
Oder wickeln Sie es in einer Funktion:
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
Nun ist die Funktionsprüfung für alleunichar
Werte in einem zusammengesetzten Zeichen machen - diese Weise, wenn Sie ein zusammengesetztes Zeichen haben, wird die Funktion nur wahr zurück, wenn sowohl das Basiszeichen als auch das Kombinierzeichen sind vorhanden:
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
Die letzte Version ist wichtig.Wenn Ihr Character
ein zusammengesetztes Zeichen ist, müssen Sie prüfen, ob sowohl das Basiszeichen ("a") als auch das Kombinierzeichen (der akute Akzent) im Zeichensatz vorhanden ist, sonst erhalten Sie Fehlalarme.
Das ist sehr interessant. Es löst mein Problem nicht genau, daher kann ich es nicht als Antwort bezeichnen, aber es erklärt, warum es keinen direkten "Charakter" -> "Unichar" gibt. –
Ich habe meine Antwort etwas verfeinert. Seien Sie vorsichtig, dass die Antwort von matt, während eine gute Möglichkeit, nach nicht zusammengesetzten Zeichen zu suchen, für zusammengesetzte Zeichen möglicherweise nicht funktioniert. –
Ich verdaue das immer noch. Faszinierend. –