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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 21:22:10