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
相关产品推荐
相关产品推荐

