加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

swift – 如何处理reduce函数的初始nil值

发布时间:2020-12-14 04:36:52 所属栏目:百科 来源:网络整理
导读:我想在 Swift中学习和使用更多函数式编程.所以,我一直在操场上尝试各种各样的事情.不过,我不明白Reduce.基本的教科书示例有效,但我无法理解这个问题. 我有一个名为“toDoItems”的字符串数组.我想获得这个数组中最长的字符串.在这种情况下处理初始零值的最佳
我想在 Swift中学习和使用更多函数式编程.所以,我一直在操场上尝试各种各样的事情.不过,我不明白Reduce.基本的教科书示例有效,但我无法理解这个问题.

我有一个名为“toDoItems”的字符串数组.我想获得这个数组中最长的字符串.在这种情况下处理初始零值的最佳做法是什么?我想这可能经常发生.我想过编写一个自定义函数并使用它.

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)) }

解决方法

可能只是Swift不会自动推断出初始值的类型.尝试通过明确声明来明确它:

var longestOfStrings = toDoItems.reduce(nil as Int?) { optionalMax($0,count($1)) }

顺便说一下,我不指望$0(你的累加器),因为它不是一个字符串而是一个可选的Int Int?

通常为了避免以后读取代码的混淆,我明确地将累加器标记为a,并将来自serie的元素标记为x:

var longestOfStrings = toDoItems.reduce(nil as Int?) { a,x in optionalMax(a,count(x)) }

当使用累加器或单个元素时,这种方式应该比代码中的$0和$1更清晰.

希望这可以帮助

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读