Я хотел бы разделить строку 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 и добавлено кэширование uppercaseLetters, что повышает производительность в очень длинных строках и узких циклах.