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

Swift:如何通过Extension分组结构体属性(不修改原实现)

实现属性分组的解决方案

当然可以搞定这个需求!我们完全不需要修改MyStruct的原始代码,只通过扩展就能实现你想要的分组访问方式,让不同功能模块的属性逻辑更清晰。

具体实现代码

// 原结构体保持完全不变
struct MyStruct {
    var a1: Int // 该属性用于功能A
    var a2: Int // 该属性用于功能A
    var a3: Int // 该属性用于功能A
    var b1: Int // 该属性用于功能B
    var b2: Int // 该属性用于功能B
}

// 扩展实现分组逻辑
extension MyStruct {
    // 功能A的属性分组容器
    struct AFeatures {
        private let parent: MyStruct
        
        init(parent: MyStruct) {
            self.parent = parent
        }
        
        // 只读访问版本
        var a1: Int { parent.a1 }
        var a2: Int { parent.a2 }
        var a3: Int { parent.a3 }
        
        // 如果需要支持修改,替换成带setter的计算属性
        // var a1: Int {
        //     get { parent.a1 }
        //     set { parent.a1 = newValue }
        // }
    }
    
    // 功能B的属性分组容器
    struct BFeatures {
        private let parent: MyStruct
        
        init(parent: MyStruct) {
            self.parent = parent
        }
        
        var b1: Int { parent.b1 }
        var b2: Int { parent.b2 }
        
        // 同理,需要修改的话添加setter
        // var b1: Int {
        //     get { parent.b1 }
        //     set { parent.b1 = newValue }
        // }
    }
    
    // 对外提供分组的访问入口
    var aFeatures: AFeatures {
        AFeatures(parent: self)
    }
    
    var bFeatures: BFeatures {
        BFeatures(parent: self)
    }
}

使用示例

// 创建实例
let obj = MyStruct(a1: 1, a2: 2, a3: 3, b1: 4, b2: 5)

// 按分组读取属性
let a1Value = obj.aFeatures.a1 // 结果为1
let b1Value = obj.bFeatures.b1 // 结果为4

// 如果开启了setter,还能直接修改属性
var mutableObj = MyStruct(a1: 1, a2: 2, a3: 3, b1: 4, b2: 5)
mutableObj.aFeatures.a1 = 10
print(mutableObj.a1) // 输出10

方案原理说明

  • 嵌套的AFeatures和BFeatures结构体通过私有引用持有原MyStruct实例,确保能安全访问原属性。
  • 分组内的属性是计算属性,直接映射到原结构体的对应属性,既实现了逻辑分组,又完整保留了原属性的读写特性。
  • 这种方式完美隔离了不同功能模块的属性访问,让每个模块只关注自己分组内的属性,大幅提升代码的逻辑清晰度和可维护性。

内容的提问来源于stack exchange,提问作者hoang Cap

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 19:54:09