Dan*_*iel 5 reduce functional-programming swift
我想在 Swift 中学习和使用更多的函数式编程。所以,我一直在操场上尝试各种事情。不过,我不明白Reduce。基本的教科书示例有效,但我无法解决这个问题。
我有一个名为“toDoItems”的字符串数组。我想获得这个数组中最长的字符串。在这种情况下处理初始 nil 值的最佳做法是什么?我想这可能经常发生。我想写一个自定义函数并使用它。
func optionalMax(maxSofar: Int?, newElement: Int) -> Int {
if let definiteMaxSofar = maxSofar {
return max(definiteMaxSofar, newElement)
}
return newElement
}
// Just testing - nums is an array of Ints. Works.
var maxValueOfInts = nums.reduce(0) { optionalMax($0, $1) }
// ERROR: cannot invoke 'reduce' with an argument list of type ‘(nil, (_,_)->_)'
var longestOfStrings = toDoItems.reduce(nil) { optionalMax(count($0), count($1)) }
Run Code Online (Sandbox Code Playgroud)
可能只是 Swift 不会自动推断初始值的类型。尝试通过明确声明来使其清楚:
var longestOfStrings = toDoItems.reduce(nil as Int?) { optionalMax($0, count($1)) }
Run Code Online (Sandbox Code Playgroud)
顺便请注意,我不依赖$0(你的累加器),因为它不是一个String,而是一个可选的 IntInt?
通常,为了避免稍后阅读代码时出现混淆,我将累加器明确标记为,a并将来自系列的元素标记为x:
var longestOfStrings = toDoItems.reduce(nil as Int?) { a, x in optionalMax(a, count(x)) }
Run Code Online (Sandbox Code Playgroud)
当使用累加器或单个元素时,这种方式应该比代码中的$0和更清晰。$1
希望这可以帮助