gpt4 book ai didi

swift - 有什么合理的方法可以访问 CharacterSet 的内容吗?

转载 作者:可可西里 更新时间:2023-10-31 23:58:45 24 4
gpt4 key购买 nike

对于随机字符串生成器,我认为使用 CharacterSet 作为要使用的字母表的输入类型会很好,因为预定义集如 CharacterSet.lowercaseLetters 显然很有用(即使它们可能包含比您预期的更多样的字符集)。

但是,显然您只能查询字符集的成员资格,而不能枚举它们,更不用说索引它们了。我们得到的只是 _.bitmapRepresentation,这是一个 8kb 的数据 block ,每个 (?) 字符都有一个指示位。但是,即使您通过索引 i 剥离单个位(这不太好,通过面向字节的 Data),Character(UnicodeScalar(i)) 没有给出正确的字母。这意味着格式有些模糊——当然,它是 not documented .

当然可以iterate over all characters (per plane)但从成本角度来看,这是一个坏主意:20 个字符的集合可能需要迭代数万个字符。用 CS 术语来说:位向量是稀疏集的(非常)糟糕的实现。为什么他们选择在这里以这种方式进行权衡,我不知道。

我是不是遗漏了什么,或者 CharacterSet 只是 Foundation API 中的另一个死胡同?

最佳答案

正在关注 the documentation ,这里是对 Satachito 的改进,通过实际考虑平面索引来支持非连续平面的情况:

extension CharacterSet {
func codePoints() -> [Int] {
var result: [Int] = []
var plane = 0
// following documentation at https://developer.apple.com/documentation/foundation/nscharacterset/1417719-bitmaprepresentation
for (i, w) in bitmapRepresentation.enumerated() {
let k = i % 8193
if k == 8192 {
// plane index byte
plane = Int(w) << 13
continue
}
let base = (plane + k) << 3
for j in 0 ..< 8 where w & 1 << j != 0 {
result.append(base + j)
}
}
return result
}

func printHexValues() {
codePoints().forEach { print(String(format:"%02X", $0)) }
}
}

用法

print("whitespaces:")
CharacterSet.whitespaces.printHexValues()
print()
print("two characters from different planes:")
CharacterSet(charactersIn: "𝚨󌞑").printHexValues()

结果

whitespaces:
09
20
A0
1680
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
200A
200B
202F
205F
3000

two characters from different planes:
1D6A8
CC791

表演

这实际上比遍历所有字符快 3 到 10 倍:与之前在 NSArray from NSCharacterset 的答案进行比较。 .

关于swift - 有什么合理的方法可以访问 CharacterSet 的内容吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43322441/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com