我是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
功能。
感谢您的帮助。
答案 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: "")")