swift - 将字符集转换为字符串或数组或字符集

标签 swift nscharacterset

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 指出的答案中找到。两个答案都以相同的 algorithm 结束。 。我只想看看套装里的内容。是的,想要这样做并不常见。 事实证明,获取 CharacterSet 的所有元素的唯一方法是循环遍历所有可能的 unicode 标量并检查它们是否属于该集合。我觉得这个词很奇怪,我们可以如此轻松地在 SetArray 甚至 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:是的,这个问题是重复的,而且更好 answer存在。

关于swift - 将字符集转换为字符串或数组或字符集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55473051/

相关文章:

string - 如何在 Swift 2.0 中使用 stringByAddingPercentEncodingWithAllowedCharacters() 作为 URL

ios - 所有 iPhone 标准键盘字符的字符串编码

objective-c - 从 NSCharacterSet 生成随机字符串

ios - 当用户按下按钮时,如何在我的 swift 应用程序中切换到另一个 viewController?

ios swift 确实选择了行来检查字符串是否相等

xcode - 在 Facebook 上快速分享

ios - Swift 4.2,Xcode 10.2 无合并运算符警告

ios - 如何将 segue 从 TableView 中的单元格单击推送到另一个 View Controller

iphone - 为什么whitespaceAndNewlineCharacterSet不删除空格?

swift - 元组 Void (aka ()) 的值没有成员 "isSuperset"