Swift中如何避免为关联类型为Void的枚举显式指定(())
简化Void关联类型的TestResult枚举写法
问题说明
我们定义了类似标准Result的枚举:
enum TestResult<SuccessData, FailureData> { case success(SuccessData) case failure(FailureData) }
当关联类型是具体数据类型时,用起来很顺畅:
let result: TestResult<TestData, FailureReport> = .success(someData)
但要是关联类型是Void,就得写成let result: TestResult<Void, Void> = .success(()),这种带(())的写法太繁琐,能不能省略?
解决方案
1. 给Void专属场景加静态属性
给TestResult写个扩展,限定关联类型都是Void时,提供不带参数的静态属性替代原来的case:
extension TestResult where SuccessData == Void, FailureData == Void { static var success: TestResult { .success(()) } static var failure: TestResult { .failure(()) } }
之后用的时候直接写:
let result: TestResult<Void, Void> = .success
2. 单独处理单一Void关联类型
如果只是其中一个关联类型是Void,可以分开扩展:
// 仅成功类型为Void时 extension TestResult where SuccessData == Void { static var success: TestResult { .success(()) } } // 仅失败类型为Void时 extension TestResult where FailureData == Void { static var failure: TestResult { .failure(()) } }
比如只有成功类型是Void时,就能这么写:
let result: TestResult<Void, FailureReport> = .success
3. 用类型别名减少重复声明
如果经常用到TestResult<Void, Void>,可以先定义一个类型别名:
typealias VoidResult = TestResult<Void, Void>
再结合上面的静态属性扩展,写法会更简洁:
let result: VoidResult = .success
内容的提问来源于stack exchange,提问作者Wade Tregaskis
相关产品推荐
相关产品推荐

