Swift中如何用协议与闭包重构Set结构体(学习用途)
面向协议重构Set结构体的解决方案
核心协议定义
先抽象集合操作的核心行为,定义约束协议:
protocol DictSet { associatedtype Element: Hashable mutating func insert(_ element: Element) func contains(_ element: Element) -> Bool var isEmpty: Bool { get } }
字典实现结构体
实现遵循DictSet协议的DictImpl,采用字典存储元素,直接赋值字典而非调用闭包:
struct DictImpl<T: Hashable>: DictSet { private var elements: [T: Bool] init() { // 直接初始化空字典,避免误调用闭包 self.elements = [:] } mutating func insert(_ element: T) { elements[element] = true } func contains(_ element: T) -> Bool { elements[element] ?? false } var isEmpty: Bool { elements.isEmpty } }
保留emptySet原有实现思路
延续基于字典的初始化逻辑,保持emptySet的原有结构:
let emptySet: DictImpl<Int> = { var set = DictImpl<Int>() // 保留原emptySet的字典实现思路 return set }()
保留useSets的原有结构
完全保留useSets中的let声明和if判断逻辑:
func useSets() { var set1 = emptySet set1.insert(5) let set2 = DictImpl<String>() if set1.contains(5) && set2.isEmpty { print("Set operations work correctly!") } }
关键说明
- 协议抽象:
DictSet将集合操作抽象化,后续可扩展其他实现(如基于数组的Set) - 闭包问题修复:之前的错误是误将闭包调用(如
elements = createDict())改为直接赋值空字典[:],符合"直接赋值闭包本身"的修正方向 - 类型推断支持:
set2可通过上下文自动推断为DictImpl<String>,满足类型推断需求 - 结构完整性:
emptySet的闭包初始化、useSets中的let和if语句完全保留,未修改原有结构
内容的提问来源于stack exchange,提问作者Adrian
相关产品推荐
相关产品推荐

