Swift中避免重复创建Set,优化reduce统计逻辑的技术问询
解决方案:避免重复创建Set且无需临时变量
当然可以搞定这个问题!你完全不用重复创建Set,也不需要额外的临时变量来存储它——咱们可以用Swift里的with方法优雅地解决,既高效又符合你的需求。
先聊聊你之前写法的问题
你尝试的Set(h).reduce(0,{self.contains($1+1) ? $0 + 1 : $0})之所以行不通,是因为reduce闭包内部的self指向的是闭包本身,而不是外部的集合实例,闭包并没有contains方法,自然会编译报错。
最优实现方式
我们可以用with方法绑定一次性创建好的Set实例,让reduce闭包直接复用这个实例,完全避免重复创建集合的开销:
let h = [1,2,3,4,5,2,3] // 示例:包含重复元素的数组 let count = Set(h).with { set in set.reduce(0) { accumulator, element in set.contains(element + 1) ? accumulator + 1 : accumulator } }
代码逻辑拆解
Set(h)只执行一次,创建唯一的集合实例;with方法把这个集合实例传递给内部闭包,我们用set变量引用它;- 在reduce的闭包里,直接复用这个
set判断element + 1是否存在,不会再创建新的集合; - 整个过程没有额外的临时变量污染外部作用域,完美匹配你的需求。
更紧凑的写法(可选)
如果追求代码简洁,也可以用尾随闭包简化写法(注意给集合起个明确的名字,避免参数混淆):
let count = Set(h).with { s in s.reduce(0) { s.contains($1+1) ? $0+1 : $0 } }
内容的提问来源于stack exchange,提问作者Young
相关产品推荐
相关产品推荐

