我试图通过reduce函数加入String数组的元素.现在尝试了一下,但我无法得到问题的确切原因.这是我认为应该做的伎俩.我也尝试了其他替代方案,但考虑到巨额我会等待一些输入:
var genres = ["towel", "42"]
var jointGenres : String = genres.reduce(0, combine: { $0 + "," + $1 })
Run Code Online (Sandbox Code Playgroud)
错误:
..:14:44:无法使用类型'的参数列表调用'+'(IntegerLiteralConvertible,combine:(($ T6,($ T6,$ T7) - >($ T6,$ T7) - > $ T5) - >($ T6,($ T6,$ T7) - > $ T5) - > $ T5,(($ T6,$ T7) - >($ T6,$ T7) - > $ T5,$ T7) - > (($ T6,$ T7) - > $ T5,$ T7) - > $ T5) - >(($ T6,($ T6,$ T7) - > $ T5) - > $ T5,(($ T6, $ T7) - > $ T5,$ T7) - > $ T5) - > $ T5)'
根据我的理解,$ 0应该被推断为一个字符串,而$ 1,与$ 0的组合,也应该作为一个字符串.我不知道这里的类型系统有什么用处.任何的想法?
erd*_*ser 22
你的reduce闭包应该是这样的:
var jointGenres : String = genres.reduce("", combine: { $0 == "" ? $1 : $0 + "," + $1 })
Run Code Online (Sandbox Code Playgroud)
这具有""代替0你的样式,并确保在返回值的开头没有额外的逗号.
原始代码不起作用,因为在您的答案中,文档中表示为U的返回类型最初为0,而您尝试向其添加字符串.在你的情况下,你真的希望U和T代表字符串而不是Ints.
Mih*_*ian 13
reduce不是一个简单的解决方案,因为您需要对第一个元素进行特殊处理.字符串的连接方法更适用于此目的:
let strings = ["a", "b", "c"]
let joinedString = ",".join(strings)
Run Code Online (Sandbox Code Playgroud)
如果你知道数组不是空的,还有另一个可能的减少解决方案,也避免了条件:
let joinedStrings = strings[1..<strings.count].reduce(strings[0]) { $0 + "," + $1 }
Run Code Online (Sandbox Code Playgroud)
Cocoa已经具备了这样做的功能.它需要对NSArray进行类型转换.
var genres = ["towel", "42"]
var joinGenres = (genres as NSArray).componentsJoinedByString(",")
Run Code Online (Sandbox Code Playgroud)
令我惊讶的是,此函数也可以应用于String以外的类型数组:
let ints = [1,5,9,15,29]
let listOfInts = (ints as NSArray).componentsJoinedByString(",")
Run Code Online (Sandbox Code Playgroud)
小智 7
如果使用 Swift 4:
var jointGenres:String = genres.joined(separator: ",")
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12360 次 |
| 最近记录: |