NSCharacterSet.characterIsMember()与Swift的字符类型
想象一下,你有一个Swift的字符类型的实例,你想要确定它是否是一个NSCharacterSet的成员。 NSCharacterSet的characterIsMember方法需要一个unichar,所以我们需要从Character到unichar。
我可以想出的唯一解决方案是以下,其中c是我的性格: let u: unichar = ("(c)" as NSString).characterAtIndex(0) if characterSet.characterIsMember(u) { dude.abide() } 我看着字符,但没有跳跃在我作为一种方式从它到unichar。这可能是因为字符比unichar更通用,所以直接转换不会是安全的,但我只是猜测。 如果我迭代一个整个字符串,我会做这样的事情: let s = myString as NSString for i in 0..<countElements(myString) { let u = s.characterAtIndex(i) if characterSet.characterIsMember(u) { dude.abide() } } (警告:以上是伪代码,从来没有任何人曾经运行过。)但这不是我真正的问题。
我的理解是unichar是一个typealias UInt16。 unichar只是一个数字。
我认为你面临的问题是,Swift中的一个字符可以由多个unicode“字符”组成。因此,它不能被转换为单个unichar值,因为它可以由两个unichar组成。您可以通过将字符转换为字符串并使用utf16属性将字符分解为各个unichar值,如下所示: let c: Character = "a" let s = String(c) var codeUnits = [unichar]() for codeUnit in s.utf16 { codeUnits.append(codeUnit) } 这将产生一个数组 – codeUnits – unichar值。 编辑:初始代码已为codeUnit在s时,它应该是为sUut中的codeUnit 你可以整理和测试每个单独的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 最后的版本很重要。如果你的角色是一个组合的角色,你必须检查基本字符(“a”)和组合字符(急性重音)在字符集的存在,否则你会得到假阳性。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |