具有Swift字符类型的NSCharacterSet.CharacterMember()

假设您有一个Swift的字符类型的实例,您想确定它是否是NSCharacterSet的成员NSCharacterSetcharacterMember方法采用unichar,因此我们需要从Characterunichar

我能想到的唯一解决方案是以下内容,其中c是我的字符

让u:unichar=(“\(c)”作为NSString)。characterAtIndex(0)
if characterSet.characterize成员(u){
老兄
}

我看了看字符,但没有任何东西向我跳出来,作为从它到unichar的一种方式。这可能是因为Characterunichar更通用,所以直接转换并不安全,但我只是猜测

如果我迭代整个字符串,我会这样做:

让s=myString作为NSString
对于0中的i..<countElements(myString){
设u=s.characterAtIndex(i)
if characterSet.characterize成员(u){
老兄
}
}

(警告:以上是伪代码,从来没有人运行过。)但这不是我真正想问的

我的理解是,unicharUInt16的类型别名。一个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”)和组合字符(锐重音),否则会出现误报

发表评论