我正在尝试对骆驼案进行简单的破解: "这 - 是 - 我的-ID"将成为" thisIsMyId"在快速3(或4)。
无论我做什么,我都无法找到一种优雅的方式来做到这一点......: 以下不起作用:
str.split(separator: "-").enumerated().map { (index, element) in
return index > 0 ? element.capitalized : element
}.reduce("", +)
它哭泣着所有的东西。我相信有一个简单的方法......任何人?
答案 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))"
}
全部谢谢!