字符串数组减少

Nic*_*tto 13 reduce swift

我试图通过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)

  • 必须在 Swift 4 中执行 `joinedString = strings.joined(separator: ";")` (2认同)

Ale*_*exT 8

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)