Swift 3/4 dash to camel case (Snake to camelCase)

Swift 3/4 dash to camel case (Snake to camelCase)

我正在尝试对驼峰式大小写进行简单的破折号,因此: "this-is-my-id" 将在 swift 3(或 4)中变为 "thisIsMyId"。

无论我做什么,我都找不到足够优雅的方式来做..: 以下无效:

str.split(separator: "-").enumerated().map { (index, element) in
    return index > 0 ? element.capitalized : element
}.reduce("", +)

它哭了一大堆东西。我相信有一个足够简单的方法......有人吗?

您可以根据破折号“-”拆分字符串(创建字符串数组)并将其元素与所需大小写组合:

let myString = "this-is-my-id"
let newString = myString.split(separator: "-").reduce("", { [=10=] + .capitalized })

print(newString) // "ThisIsMyId"

如果您通过创建新字符串来解构 String.Subsequence 元素,则您的语法有效:

str.split(separator: "-").enumerated().map { (index, element) in
     return index > 0 ? String(element).capitalized : String(element)
}.joined() // better than `reduce`

您的代码几乎是正确的。以下是我发现的最具可读性的实现:

let str: String = "this-is-my-id"

let result = str
    .split(separator: "-")  // split to components
    .map { String([=10=]) }   // convert subsequences to String
    .enumerated()  // get indices
    .map { [=10=].offset > 0 ? [=10=].element.capitalized : [=10=].element.lowercased() } // added lowercasing
    .joined() // join to one string

print(result)

您可以遍历字符(String 是字符的集合),同时持有一个标志,告诉字符是否在破折号之后,以便将其大写:

let dashCase = "this-is-my-id"
let camelCase = dashCase.reduce(into: ("", false)) {
    // mark the dash
    guard  != "-" else { [=10=].1 = true; return }
    [=10=].0 += [=10=].1 ? String().uppercased() : String()
    // reset the flag so we don't capitalize the next ones
    [=10=].1 = false
}.0
print(camelCase)  // thisIsMyId

所有这些答案的组合将导致以下最短方式(我认为 - 只有 2 次交互):

let str: String = "this-is-my-id"

let result = str.split(separator: "-").reduce("") {(acc, name) in
    "\(acc)\(acc.count > 0 ? String(name.capitalized) : String(name))"
}

谢谢大家!

Swift 4.1.

更好地实现了@sulthan 的回答
extension String {
    func camelCased(with separator: Character) -> String {
        return self.lowercased()
            .split(separator: separator)
            .enumerated()
            .map { [=10=].offset > 0 ? [=10=].element.capitalized : [=10=].element.lowercased() }
            .joined()
    }
}