Swift中如何为带关联值的枚举设置关联值默认值
问题结论
Swift 原生不支持直接给枚举关联值设置默认参数、省略括号直接用case名初始化的语法,但通过扩展静态成员的方式可以完全实现你需要的效果,不需要改动原有枚举的核心定义。
实现代码
先修正原代码的语法细节(Swift类型名首字母需大写),再添加对应扩展即可:
public enum Stationary: SomeStationaryClass { case pen(brand: Brands) case paper(brand: Brands) case pencil(brand: Brands) } public enum Brands { case brand1 case brand2 } extension Stationary { // 省略参数时自动填充默认品牌brand1 public static var pen: Self { .pen(brand: .brand1) } public static var paper: Self { .paper(brand: .brand1) } public static var pencil: Self { .pencil(brand: .brand1) } }
运行效果
两种调用方式都符合预期:
- 显式传参:
var item1 = Stationary.pen(brand: .brand2),item1关联品牌为brand2,走枚举原生的关联值构造逻辑 - 省略参数:
var item2 = Stationary.pen,编译器会匹配扩展中的静态属性,自动返回关联品牌为brand1的实例
注意点
- 该写法不会破坏枚举原有的模式匹配能力,switch语句中正常使用
case .pen(let brand)匹配即可 - 目前Swift不支持直接给枚举case的关联值写默认参数,比如
case pen(brand: Brands = .brand1)属于非法语法 - 如果后续需要调整默认品牌,只需要修改扩展中静态属性的返回值,不需要改动其他业务代码
内容的提问来源于stack exchange,提问作者user52563
相关产品推荐
相关产品推荐

