我无法想象在Swift中重新创建以下代码的优雅方式:
在Python中(正确,简洁,优雅):
>>> def splits(word):
... return [(word[:i], word[i:]) for i in range(len(word) + 1)]
...
>>> splits("abc")
[('', 'abc'), ('a', 'bc'), ('ab', 'c'), ('abc', '')]
在Swift中(虚假而有点偏执):
func splits(word: String) -> [(String,String)] {
return word.characters.indices.map {
return (word[word.startIndex..<$0], word[$0..<word.endIndex])
}
}
splits("abc")
"[("", "abc"), ("a", "bc"), ("ab", "c")]"
如您所见,Swift版本缺少最后一对。如何知道字符串上的索引不会传递给地图闭包中的最后一个字符,我怎么能实现这一点(除了手动添加最后一对)?
编辑:
我从答案中改编了这个:
func splits(word: String) -> [(String,String)] {
let chars = word.characters
return (0...chars.count).map {
(String(chars.dropFirst($0)),String(chars.dropLast(chars.count - $0)))
}
}
答案 0 :(得分:1)
一种可能的解决方案
func splits(word: String) -> [(String,String)] {
var arr:[(String,String)] = []
(0...word.characters.count).forEach {
arr.append(( String(word.characters.dropFirst($0)),String(word.characters.dropLast(word.characters.count - $0))))
}
return arr
}
let str = "abc"
let arr = splits(str)
print(arr) // [("abc", ""), ("bc", "a"), ("c", "ab"), ("", "abc")]
答案 1 :(得分:1)
另一种可能的解决方案:
func splits(word: String) -> [(String, String)] {
return (0 ... word.characters.count).map {
(word.substringToIndex(word.startIndex.advancedBy($0)),
word.substringFromIndex(word.endIndex.advancedBy(-$0)))
}
}
splits("abc")
// [("", "abc"), ("a", "bc"), ("ab", "c"), ("abc", "")]