迅速3/4冲刺到骆驼案(Snake to camelCase)

时间:2018-02-18 07:34:14

标签: swift swift3

我正在尝试对骆驼案进行简单的破解: "这 - 是 - 我的-ID"将成为" thisIsMyId"在快速3(或4)。

无论我做什么,我都无法找到一种优雅的方式来做到这一点......: 以下不起作用:

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

它哭泣着所有的东西。我相信有一个简单的方法......任何人?

6 个答案:

答案 0 :(得分:5)

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

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

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

print(result)

答案 1 :(得分:2)

使用Swift 4.1更好地实现@sulthan的答案。

extension String {
    public func camelCased(with separator: Character) -> String {
        return self.lowercased()
            .split(separator: separator)
            .enumerated()
            .map { $0.offset > 0 ? $0.element.capitalized : $0.element.lowercased() }
            .joined()
}

答案 2 :(得分:1)

你可以做的是根据破折号溢出你的字符串" - " (创建一个字符串数组)并将其元素与所需的大小写相结合:

let myString = "this-is-my-id"
let newString = myString.split(separator: "-").reduce("", { $0 + $1.capitalized })

print(newString) // "ThisIsMyId"

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

你可以迭代字符(String是一个字符集合),同时拿着一个标志告诉字符是否在破折号之后,以便将其大写:

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

答案 5 :(得分:0)

所有这些答案的组合将导致以下,最短的方式(我认为 - 只有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))"
}

全部谢谢!