Swift中是否可以根据条件有选择性地声明struct的成员变量?
结论
不支持你写的这种运行时条件判断的成员声明写法
原因
struct的成员列表、内存布局必须在编译阶段就完全确定,你写的if (condition)是运行时才会执行判断的逻辑,编译阶段无法提前确定要保留哪个成员,所以这种写法语法上就不被允许。
替代实现方案
你可以根据实际需求选以下三种实现方式:
- 方案1:用枚举关联值实现(最贴合「仅存两个值其中一个」的需求,无冗余内存)
示例代码(Swift语法):
使用时通过switch判断当前存储的是哪个值即可,每次实例只会保留其中一个值。enum Example { case a(Int) case b(Int) } - 方案2:struct属性声明为可选类型,初始化时按条件赋值
如果你必须用struct实现,可以把两个属性都设为可选,初始化时只给对应条件的属性赋值,另一个设为nil:struct Example { let a: Int? let b: Int? init(condition: Bool, value: Int) { if condition { self.a = value self.b = nil } else { self.a = nil self.b = value } } } - 方案3:如果条件是编译期可确定的,用编译宏实现
如果你的condition是编译阶段就能确定的常量(比如编译环境标记、全局编译宏),可以用编译条件判断,编译时就只会保留对应成员:struct Example { #if YOUR_CONDITION_MACRO let a: Int #else let b: Int #endif }
内容的提问来源于stack exchange,提问作者Lae
相关产品推荐
相关产品推荐

