【发布时间】:2016-12-22 22:40:52
【问题描述】:
我想将 CamelCase 字符串分隔为新字符串中的空格分隔的单词。这是我目前所拥有的:
var camelCaps: String {
guard self.count > 0 else { return self }
var newString: String = ""
let uppercase = CharacterSet.uppercaseLetters
let first = self.unicodeScalars.first!
newString.append(Character(first))
for scalar in self.unicodeScalars.dropFirst() {
if uppercase.contains(scalar) {
newString.append(" ")
}
let character = Character(scalar)
newString.append(character)
}
return newString
}
let aCamelCaps = "aCamelCaps"
let camelCapped = aCamelCaps.camelCaps // Produce: "a Camel Caps"
let anotherCamelCaps = "ÄnotherCamelCaps"
let anotherCamelCapped = anotherCamelCaps.camelCaps // "Änother Camel Caps"
我倾向于怀疑这可能不是转换为空格分隔单词的最有效方法,如果我在一个紧密的循环中调用它,或者 1000 次。在 Swift 中是否有更有效的方法来做到这一点?
[编辑 1:] 我需要的解决方案应该对 Unicode 标量保持通用,而不是特定于罗马 ASCII“A..Z”。
[编辑 2:] 解决方案还应跳过第一个字母,即不在第一个字母前添加空格。
[编辑 3:] 针对 Swift 4 语法进行了更新,并添加了大写字母的缓存,从而提高了在非常长的字符串和紧凑循环中的性能。
【问题讨论】:
-
单行
return unicodeScalars.reduce("") { CharacterSet.uppercaseLetters.contains($1) ? $0 + " " + String($1) : $0 + String($1)} -
如何处理连续大写字符的字符串?例如:上面的代码“大写字母”返回为“大写字母 L E T T E R S”。而预期的输出是“大写字母”。
-
@Frankenxtein 只需检查正在创建的字符串,在我们的例子中是
$0,看看最后一个字母是否也是大写的。如果是,您只需添加字符$1,不带空格。
标签: ios swift string macos camelcasing