我理解1- Linda
2- Micheal, 19, George, CA
3- NY, male
类不支持Character
和toUpper()
的原因,但我的用例不是用于语言目的。此外,我不想回复toLower()
。
那么使用Swift 4将字符转换为大写或小写的最快方法是什么?
NSString
答案 0 :(得分:3)
如果您只需要大写第一个字符,请使用下面的Barcode
。它比整个字符串的上限快5倍。
uppercase2()
在1000万次运行中,Apple的import Foundation
// too slow, maybe with some bitwise operations could get faster ♀️
func uppercase(_ string: String) -> Character? {
let key: Int8 = string.utf8CString[0]
guard key>0, key<127, let c = Unicode.Scalar(Int(key >= 97 ? key - Int8(32) : key)) else { return nil }
return Character(c)
}
// winner but using internal _core stuff
func uppercase2(_ string: String) -> Character? {
guard let key = string._core.asciiBuffer?[0] else { return nil }
return Character(Unicode.Scalar(key >= 97 ? key - 32 : key)) // use < + to lowercase
}
func measure(times: Int, task: ()->()){
let start1 = CFAbsoluteTimeGetCurrent()
for _ in 1..<times {
task()
}
print(CFAbsoluteTimeGetCurrent() - start1)
}
print("".uppercased().first as Any) // Optional("")
print(uppercase("") as Any) // nil
print(uppercase2("") as Any) // nil
measure(times: 10_000_000) { _ = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".uppercased().first } // 4.17883902788162
measure(times: 10_000_000) { _ = uppercase("ABCDEFGHIJKLMNOPQRSTUVWXYZ") } // 4.91275697946548
measure(times: 10_000_000) { _ = uppercase2("ABCDEFGHIJKLMNOPQRSTUVWXYZ") } // 0.720575034618378
运行速度比本帖底部的代码快148倍,即使使用强制解包也是如此。我会把它留给喜剧目的。
他们的做法当然是低级别的。见lowercased()。他们检查内部asciiBuffer,然后使用_asciiUpperCaseTable。
我的理解是,如果原始String已经是Swift字符串,它将由StringCore类表示,该类已经过优化,可以处理低级别的ASCII字符。因此,你将无法击败Swift的大写功能。
所以,答案是:最快的方法是使用常规的uppercased
函数。
我假设“我的用例不是用于语言目的”意味着我只使用ASCII。这提供的优点是UTF-8和ASCII共享相同的标量代码,因此大写/小写意味着减去或添加固定数字。
uppercase()