swift - 将 CharacterSet 转换为字符串或数组或字符集
问题描述
Fondation
具有CharacterSet
用于管理字符集的结构(连接到 NSCharacterSet),例如在使用Formatter
实例时。令人惊讶的是,CharacterSet 不是 Set,尽管功能和目的完全相同。不幸的是 CharacterSet 不是 Collection ether,所以现在我不知道如何检索它的元素。
// We can initialize with String
let wrongCharacterSet = CharacterSet(charactersIn: "0123456789").inverted
// but how can we get the characters back ?
var chSet = CharacterSet.decimalDigits
let chString = String(chSet) // doesn't work
let chS = Set(chSet) // doesn't work
let chArr = Array(chSet) // doesn't work
解决方案
我稍微修改了解决方案,在@Larme 和@vadian 指出的答案中找到。两个答案都以相同的算法结束。我只想看看这集的内容。是的,想要这样做并不常见。事实证明,获取所有元素的唯一方法CharacterSet
是遍历所有可能的 unicode 标量并检查它们是否属于该集合。Set
在我们可以在s和 s之间切换Array
甚至Dictionaries
如此简单的词中,我感觉很奇怪。修改的原因是为了加快功能。我的粗略实验表明,即使我们最终创建了一个字符串,使用标量也能快 30%。
extension CharacterSet {
func allUnicodeScalars() -> [UnicodeScalar] {
var result: [UnicodeScalar] = []
for plane in Unicode.UTF8.CodeUnit.min...16 where self.hasMember(inPlane: plane) {
for unicode in Unicode.UTF32.CodeUnit(plane) << 16 ..< Unicode.UTF32.CodeUnit(plane + 1) << 16 {
if let uniChar = UnicodeScalar(unicode), self.contains(uniChar) {
result.append(uniChar)
}
}
}
return result
}
}
// Testing and timing
printTimeElapsedWhenRunningCode(title:"allUnicodeScalars()") {
print(String.UnicodeScalarView(chSet.allUnicodeScalars()))
}
// Time elapsed for allUnicodeScalars(): 1.936843991279602 s.
printTimeElapsedWhenRunningCode(title:"allCharacters()") {
print(String(chSet.allCharacters()))
}
// Time elapsed for allCharacters(): 2.9846099615097046 s.
//Timing functions (for reference):
private func printTimeElapsedWhenRunningCode(title:String, operation:()->()) {
let startTime = CFAbsoluteTimeGetCurrent()
operation()
let timeElapsed = CFAbsoluteTimeGetCurrent() - startTime
print("Time elapsed for \(title): \(timeElapsed) s.")
}
private func timeElapsedInSecondsWhenRunningCode(operation: ()->()) -> Double {
let startTime = CFAbsoluteTimeGetCurrent()
operation()
let timeElapsed = CFAbsoluteTimeGetCurrent() - startTime
return Double(timeElapsed)
}
UPD:是的,这个问题是重复的,并且存在更好的答案。
推荐阅读
- reactjs - React PrivateRoute 身份验证和未解决的令牌承诺问题
- css - 固定行和列 HTML 表格,仅使用 CSS 进行水平垂直滚动
- python - 括号中的 Python Pandas 正则表达式数字从列到列表
- sql - oracle sql regexp删除字母t
- javascript - 将 Node/JavaScript 中的格式化日期转换为 UTC
- laravel - 防止 laravel 网站受到 bot 攻击
- javascript - 通过在数组 JavaScript 中推送元素来创建一个新的对象数组
- node.js - nodejs - Buffer,File,String,读取和写入编码之间的差异
- node.js - 通过 NestJS 将类实现注入基于接口的抽象控制器实现
- maven - 如何在 Windows 中设置 Maven?