You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:07:10