如何向String类型Set中批量插入多个元素?
实现Swift Set的批量元素插入
嗨,这个需求太常见了!其实你已经摸到了核心思路——就是遍历待插入的元素逐个调用insert(_:),不过我们可以把这个逻辑封装得更优雅,或者直接用Swift Set内置的方法来搞定,下面给你两种实用方案:
方案1:直接用内置的formUnion(_:)方法
Swift的Set本身就提供了批量添加元素的内置方法formUnion(_:),它会自动把传入序列里的元素(比如你的id数组)全部添加到Set中,并且自动处理重复元素(毕竟Set的特性就是存储唯一元素嘛),用法超简单:
// 初始化你的String类型Set var myStringSet: Set<String> = ["apple", "banana"] // 待插入的id数组 let idsToAdd = ["orange", "banana", "grape"] // 批量插入一步到位 myStringSet.formUnion(idsToAdd) // 最终结果:["apple", "banana", "orange", "grape"]
这个方法本质上和你遍历逐个插入的效果完全一致,但代码更简洁,不用自己写循环,推荐优先用这个!
方案2:给Set写扩展封装批量插入逻辑
如果你更习惯自己封装一个类似insert(_:)风格的方法,那扩展的写法也很直观,就像你想的那样,遍历序列逐个插入:
extension Set { // 定义一个接受任意Sequence类型参数的批量插入方法 mutating func insert<S: Sequence>(contentsOf sequence: S) where S.Element == Element { sequence.forEach { insert($0) } } }
然后调用的时候就和单个插入的语法风格保持一致了:
var myStringSet: Set<String> = ["apple", "banana"] let idsToAdd = ["orange", "banana", "grape"] myStringSet.insert(contentsOf: idsToAdd)
这样用起来更贴合你对insert方法的使用习惯,效果和formUnion完全相同。
两种方案选哪个都可以,看你自己的代码风格偏好~
内容的提问来源于stack exchange,提问作者Krunal
相关产品推荐
相关产品推荐

