假设您有一个Swift的字符
类型的实例,您想确定它是否是NSCharacterSet
的成员NSCharacterSet
的characterMember
方法采用unichar
,因此我们需要从Character
到unichar
我能想到的唯一解决方案是以下内容,其中c
是我的字符
:
让u:unichar=(“\(c)”作为NSString)。characterAtIndex(0)
if characterSet.characterize成员(u){
老兄
}
我看了看字符
,但没有任何东西向我跳出来,作为从它到unichar
的一种方式。这可能是因为Character
比unichar
更通用,所以直接转换并不安全,但我只是猜测
如果我迭代整个字符串,我会这样做:
让s=myString作为NSString
对于0中的i..<;countElements(myString){
设u=s.characterAtIndex(i)
if characterSet.characterize成员(u){
老兄
}
}
(警告:以上是伪代码,从来没有人运行过。)但这不是我真正想问的
我的理解是,unichar
是UInt16
的类型别名。一个unichar
只是一个数字
我认为您面临的问题是,Swift中的字符可以由多个unicode“字符”组成。因此,它不能转换为单个
unichar
值,因为它可能由两个unichar组成。通过将字符转换为字符串并使用
utf16
属性,可以将字符
分解为单个unichar
值,如下所示:
让c:Character=“a”
设s=String(c)
var codeUnits=[unichar]()
对于s.utf16中的代码单位{
codeUnits.append(codeUnit)
}
这将生成一个包含unichar
值的数组-codeUnits
编辑:在s.utf16中的codeUnit的初始代码应为时,s中的codeUnit的初始代码为
您可以整理并测试每个unichar
值是否位于如下字符集中:
让char:Character=“\u{63}\u{20dd}”//这是一个封闭圆内的“c”
用于字符串中的codeUnit(字符).utf16{
如果NSCharacterSet(charactersInString:“c”).CharacterizeMember(代码单位){
老兄
}//对于codeUnits[0]=“c”,dude将遵守()的规定,但对于codeUnits[1]=0x20dd(封闭圆)则不遵守
}
或者,如果您只对第一个值感兴趣(通常只对该值感兴趣)unichar
如果NSCharacterSet(charactersInString:“c”).characterMember(String(char).utf16[0]){
老兄
}
或者,将其包装在函数中:
func-isChar(字符:字符,插入集:NSCharacterSet)->;布尔{
返回set.characteristic成员(字符串(char).utf16[0])
}
设xSet=NSCharacterSet(charactersInString:“x”)
isChar(“x”,inSet:xSet)//返回true
isChar(“y”,inSet:xSet)//返回false
现在,对合成字符中的所有unichar
值进行函数检查-这样,如果您有合成字符,则函数将仅在基字符和组合字符都存在时返回true:
func-isChar(字符:字符,插入集:NSCharacterSet)->;布尔{
找到的变量=真
用于字符串中的ch(字符).utf16{
如果!set.member(ch){found=false}
}
返回发现
}
让acuteA:Character=“\u{e1}”//a带重音的“a”
让acuteacutecomposited:Character=“\u{61}\u{301}”//也是带重音的“a”
//一种字符集,包括合成和未合成的unichar值
设charSet=NSCharacterSet(charactersInString:“\u{61}\u{301}\u{e1}”)
isChar(acuteA,inSet:charSet)//返回true
isChar(acuteacomposited,inSet:charSet)//返回true(两个unichar值都匹配
最后一个版本很重要。如果您的字符
是合成字符,则必须检查字符集中是否同时存在基本字符(“a”)和组合字符(锐重音),否则会出现误报