我试图通过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的组合,也应该作为一个字符串。我不知道这里与类型系统的交易是什么。有什么想法吗?
答案 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: ",")