循环工作,尝试map-reduce时出错

时间:2018-05-04 14:53:39

标签: swift mapreduce

我是map-reduce的新手,想要稍微玩一下。我希望这个问题不是太愚蠢。

我有这个代码工作:

var str = "Geometry add to map: "
for element in geometryToAdd {
     str.append(element.toString())
}
print(str)

现在我想玩map-reduce,因为我最近学到了它。我把它重写为:

print(geometryToAdd.reduce("Geometry add to map: ", {$0.append($1.toString())}))

这给了我一个错误error: MyPlayground.playground:127:57: error: type of expression is ambiguous without more context。我做错了什么?

var geometryToAdd: Array<Geometry> = []

并且课程Geometry具有toString功能。

感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

减少歧义:

print(geometryToAdd.reduce("Geometry add to map: ", {
      $0 + $1.toString()
}))

错误来自于您只能append()变量序列:$0是不可变的String。在循环中,str是可变的:var,而不是let

查看reduce

的签名
func reduce<Result>(_ initialResult: Result, _ nextPartialResult: (Result, Element) throws -> Result) rethrows -> Result

nextPartialResult是一个函数/闭包,它接受两个参数并给出结果。此函数的参数是不可变的,它们不是inout参数。只能修改inout个参数。

了解有关函数参数immutability here的更多信息:

  

默认情况下,函数参数是常量。试图改变   函数体内函数参数的值   导致编译时错误。

答案 1 :(得分:1)

有两种类似的方法:

func reduce<Result>(_ initialResult: Result, _ nextPartialResult: (Result, Element) throws -> Result) rethrows -> Result
func reduce<Result>(into initialResult: Result, _ updateAccumulatingResult: (inout Result, Element) throws -> ()) rethrows -> Result

您正在使用第一个版本,其中$0是不可变的并且是闭包 必须返回累计值。这不会编译,因为 append()修改了其接收者。

使用第二个版本使其编译:这里$0是可变的 闭包用累计值更新$0

print(geometryToAdd.reduce(into: "Geometry add to map: ", {$0.append($1.toString())}))

答案 2 :(得分:0)

最好使用joined(separator:)代替reduce。它具有更好的性能,如果您愿意,可以放入分隔符:

print("Geometry add to map: \(geometryToAdd.map(String.init).joined(separator: "")")