字符串数组减少

时间:2014-09-20 17:59:49

标签: swift reduce

我试图通过reduce函数加入String数组的元素。现在尝试了一下,但我无法确切地解决问题。这是我认为应该做的伎俩。我也尝试了其他替代方案,但考虑到大量的数据,我会等待一些意见:

var genres = ["towel", "42"]
var jointGenres : String = genres.reduce(0, combine: { $0 + "," + $1 })

错误:

  

..: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应该被推断为一个字符串,而$ 0,与$ 0的组合,也应该作为一个字符串。我不知道这里与类型系统的交易是什么。有什么想法吗?

5 个答案:

答案 0 :(得分:22)

你的减少闭包应该是这样的:

var jointGenres : String = genres.reduce("", combine: { $0 == "" ? $1 : $0 + "," + $1 })

这样就有""而不是0,并且确保返回值的开头没有额外的逗号。

原始代码不起作用,因为在documentation中表示为U的返回类型在您的答案中最初为0,而您尝试向其添加字符串。在你的情况下,你真的希望U和T都代表字符串而不是Ints。

答案 1 :(得分:11)

reduce不是一个简单的解决方案,因为您需要对第一个元素进行特殊处理。字符串的连接方法更适用于此目的:

let strings = ["a", "b", "c"]
let joinedString = ",".join(strings)

如果您知道该数组不为空,则还有另一种可能的减少解决方案,这也避免了条件:

let joinedStrings = strings[1..<strings.count].reduce(strings[0]) { $0 + "," + $1 }

答案 2 :(得分:8)

Cocoa已经具备了这样做的功能。因为需要对NSArray进行类型转换而受到损害。

var genres = ["towel", "42"]
var joinGenres = (genres as NSArray).componentsJoinedByString(",")

令我惊讶的是,此函数也可以应用于除String之外的其他类型的数组:

let ints = [1,5,9,15,29]
let listOfInts = (ints as NSArray).componentsJoinedByString(",")

答案 3 :(得分:2)

问题是reduce的第一个参数。这是一个累加器,它是一个整数字面值,它是在块的第一次运行时作为$0传递的内容。你要求reduce函数为它添加一个字符串。

而不是0作为累加器参数,你应该传递"",一个空字符串。

这有效:

var genres = ["towel", "42"]
var jointGenres : String = genres.reduce("", combine: { $0 + "," + $1 })

答案 4 :(得分:0)

如果使用Swift 4:

var jointGenres:String = genres.joined(separator: ",")